记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就可以停止了,注意浮点误差
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ",ans); 26 } 27 }