[uva11429]Randomness

记p(i,j)表示第i次随机时,用多少个数对应到第j个事件,特别的,p(i,0)表示转移到下一次随机数的概率,那么即要求$aj/bj=\sum_{i=1}^{inf}p(i,j)/R^{i}$,容易发现这就是$aj/bj$的R进制表示,可以求出其中的某一组解
然后设f(i)表示第i次随机,有多少个数转移到下一个随机,那么有$f(i)=Rf(i-1)-\sum_{j=1}^{n}p(i,j)$,由此求出$ans=\sum_{i=1}^{inf}f(i)/R^{i}$
但显然无法做到枚举到inf,所以可以直接取$inf=50$或答案增长不超过1e-10就可以停止了,注意浮点误差

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,x,y;
 4 double ans,a[1005];
 5 int main(){
 6     while (scanf("%d%d",&m,&n)!=EOF){
 7         if ((!n)||(!m))return 0;
 8         for(int i=1;i<=n;i++){
 9             scanf("%d%d",&x,&y);
10             a[i]=1.0*x/y;
11         }
12         ans=1;
13         long long mi=1,sum=0;
14         while (1){
15             mi*=m;
16             sum*=m;
17             for(int i=1;i<=n;i++){
18                 x=(int)(a[i]*m);
19                 a[i]=a[i]*m-x;
20                 sum+=x;
21             }
22             if (1.0*(mi-sum)/mi<1e-10)break;
23             ans+=1.0*(mi-sum)/mi;
24         }
25         printf("%.6f\n",ans);
26     }
27 }
View Code

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11720410.html
今日推荐