您的位置:首页 > 其它

URAL 1936 Roshambo 题解

2014-06-07 23:11 288 查看
http://acm.timus.ru/problem.aspx?space=1&num=1936

//我发现那个kn=1.0然后慢慢减,得的答案特别逗,要kn=0,然后慢慢加,才不逗,这是什么原理
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
using namespace std;

long double f[111];
long double jc[111];
long double cf[111];

int main()
{
int i,j;
jc[1]=1.0;
for(i=2;i<=100;i++)
jc[i]=jc[i-1]*i;
cf[0]=1.0;
for(i=1;i<=100;i++)
cf[i]=cf[i-1]*3.0;
f[1]=0;
f[2]=1.5;
for(i=3;i<=100;i++)
{
f[i]=0;
long double kn=0.0;
for(j=1;j<i;j++)
{
long double k=1.0/jc[j]/jc[i-j]/cf[i-1]*jc[i];
kn+=k;
f[i]+=k*(1.0+f[j]);
}
f[i]+=1.0-kn;
f[i]/=kn;
//cout<<i<<". "<<f[i]<<"    kn="<<kn<<endl;
}
int n;
while(scanf("%d",&n)!=EOF)
printf("%lf\n",(double)f
);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: