首页 > 编程知识 正文

openjudge noi 首页,noi题库

时间:2023-05-05 15:03:42 阅读:178287 作者:2811

Input的第一行包含三个正整数t、n、d; 第2行有正整数a1、a2、…、at,表示游戏开始时口袋里的t色球、各球的个数。 以下n行表示各行有两个正整数xi、yi,第xi次抽出的颜色是yi球。 Output必须以分数输出。 这个概率明显是有理数。 输出文件包含分子/分母格式的行。 同时,要求输出最简单的形式(分子分母的相互质)。 特别是,概率0应该输出0/1,概率1应该输出1/1。 sample input 12311112231 sample output 11/12 sample input 23121151 sample output 21/3

这个主题看起来很棘手,但仔细观察就会发现其中可以进行等价处理。 让我们先看看证书:

有了以上结论,每次的概率可以直接累积(关于约分,可以筛选20000以内的素数表,保存分子分母的各因子)。 当然,显然使用高精度。 代码:

/* * prob 3360 noi 2006 bag * * @ auth : Wang junji * * @ stat 3360 AAR 2012 * * @ memo :仿真,高精度乘法* * * * * * * * int p[maxN]、cnt_num[maxN]、cnt_den[maxN]、ball[maxN]、top、t、n、d; class Huge{private: int len,ele[maxN]; 公共: huge (intx ) for ) ) len=0; x; x/=bit(ele[len]=x%bit; }huge(:len )1) memset ) ele,0,sizeof ele ); }hugeoperator*=(constintx ) for ) intI=0; i len; I ) ele[i] *=x; for(intI=0; i len; I ) ele[i 1] =ele[i]/BIT,ele[i] %=BIT; wile(ele[Len] ) len; return *this; } void print () printf ) ' %d ',ele[len - 1]; for(intI=len-2; i -1; -I ) printf(d )、ele[i]; 返回; }num(1),den ) ) 1; inlinevoidupdate(int*CNT,int x ) for ) intI=0; x i top; I ) for ); x % p[i]==0; x/=p[I](CNT[I]; 返回; }inline void mkprime () (for ) ) intI=2; i maxN; I ) if (! tag[i] ) p[top ]=i; elsefor(intj=0; j top p[j] * i maxN; j ) ) {tag[i * p[j]]=1; if(I%p[j]==0) break; } return; (}int main ) ) Freopen ) ) bag.in,) r,stdin ); freopen(bag.out )、(w )、stdout; scanf(%d%d%d )、t、n、d ); int sum=0; mkprime (; for(intI=0; i T; I ) Scanf('%d ',ball i ),sum =ball[i]; for(intI=0; i n; I ) { int x,y; scanf('%d%d )、x和y ); -y; if (! ball[y]({printf(0/1) n ); 返回0; }update(CNT_num,ball[y] ),ball[y] =D; udate(CNT_den,sum ),sum =D; }for(intI=0,tmp; i top; I ) ) tmp=STD:3360min(CNT_num[I],cnt_den[i]; cnt_num[i] -=tmp,cnt_den[i] -=tmp; while(CNT_num[I]-- ) num *=p[i]; while(CNT_den[I]-- ) den *=p[i]; } num.print (; printf () /; den.print (; 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。