推出数学公式:
#include<stdio.h> #include<string.h> __int64 C(int m,int n) { __int64 tmp=1; if(m>(n-m))m=n-m; for(int i=1; i<=m; i++) { tmp*=(n--); tmp/=i; } return tmp; } int main() { int n,s; int i,j,k; //printf("#%I64d ",C(10,50)); while(scanf("%d%d",&n,&s)!=EOF) { double sum=0,tsum; if(s>n) { printf("100.00000 "); continue; } if(s==0) printf("0.00000 "); else { for(i=0; i<=s; i++) { sum+=(double)C(i,n)*((__int64)1<<(n-i)); if(i==s-1) tsum=sum; } printf("%.5lf ",100.0*tsum/sum); } } return 0; }
反面推出数学公式(超__int64):
#include<stdio.h> #include<math.h> __int64 C(int m,int n) { __int64 tmp=1; if(m>(n-m))m=n-m; for(int i=1;i<=m;i++) { tmp*=(n--); tmp/=i; } return tmp; } __int64 Sum(int n,int s) { __int64 tmp=0,ret=1; for(int i=0;i<n-s;i++) { tmp+=(C(i,n)*ret); ret*=2; } return tmp; } int main() { int n,s; //printf("%d",C(25,50)); while(scanf("%d%d",&n,&s)!=EOF) { if(n<s) { printf("100.00000 "); continue; } if(s==0)printf("0.00000 "); else { //printf("%lf ",pow(3,n)); printf("%.5lf ",100-100.0*C(s,n)*pow(2,n-s)/(pow(3,n)-Sum(n,s))); } } return 0; }
Dp解法:
转载:
//f(a,b)=2*f(a-1,b)+f(a-1,b-1)是公式 #include<stdio.h> double p[51][51],o[51][51],k[51][51]; int main() { int a,b,c,d; p[1][0]=2;p[1][1]=3; for(a=1;a<=50;a++) { o[a][0]=0; o[1][a]=2; } for(a=2;a<=50;a++) { p[a][0]=2*p[a-1][0]; p[1][a]=3; } for(a=2;a<=50;a++) for(b=1;b<=50;b++) { p[a][b]=2*p[a-1][b]+p[a-1][b-1]; } for(a=2;a<=50;a++) for(b=1;b<=50;b++) { if(b>=a) o[a][b]=3*p[a-1][b-1]-1; else o[a][b]=2*o[a-1][b]+o[a-1][b-1]; } for(a=1;a<=50;a++) for(b=1;b<=50;b++) { k[a][b]=o[a][b]/p[a][b]*100; } while(scanf("%d%d",&a,&b)!=EOF) { if(b>a) printf("100.00000 "); else printf("%.5lf ",k[a][b]); } return 0; }
#include<stdio.h> #include<string.h> #define MM 1000000000000000.0 double dp[55][55]; int main() { int n,s,i,j; while(scanf("%d%d",&n,&s)!=EOF) { memset(dp,0,sizeof(dp)); if(s==0) { printf("0.00000 "); continue; } dp[1][s] = 2; dp[1][s-1] = 1; for(i = 2; i <= n ; i++) for(j = 0 ; j <= s ; j++) { dp[i][j] = dp[i-1][j]*2+dp[i-1][j+1]; } double ss=0; for(i = 0; i <= s ; i++) { ss+=dp[n][i]/MM; } dp[n][0] = dp[n][0]/MM; double x = 1-1.0*dp[n][0]/ss; printf("%.5lf ",x*100); } return 0; }