Codeforces Gym 101174 J Risky Lottery 计算方法 逼近求值 dfs
Posted polya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Gym 101174 J Risky Lottery 计算方法 逼近求值 dfs相关的知识,希望对你有一定的参考价值。
#include<stdio.h> #include <math.h> using namespace std; int fac[10],a[10]; #define db double db p[10],f[10]; int n,m; void dfs(int now,int remain) { if(now==m) { a[now]=remain; //dfs出 int tmp=fac[n-1]; for(int i=1;i<=m;i++)tmp/=fac[a[i]]; db poss=tmp; for(int i=1;i<=m;i++) poss*=pow(p[i],a[i]); //n-1个人发生给定A的选数情况下的概率是 ∏pi^ai * (n-1)! /(∏ai!) for(int i=1;i<=m;i++) { if(!a[i]) f[i]+=poss; else if(a[i]==1)break; } return ; } for(int i=0;i<=remain;i++) { a[now]=i; dfs(now+1,remain-i); } } bool check() { int mx=1; for(int i=1;i<=m;i++) if(f[i]>f[mx])mx=i; for(int i=1;i<=m;i++) if(fabs(f[i]-f[mx])>1e-6)return false; return true; } int main() { //freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); fac[0]=1; for(int i=1;i<10;i++) fac[i]=fac[i-1]*i; for(int i=1;i<=m;i++) p[i]=1./m; db o=10; do { for(int i=1;i<=m;i++) f[i]=0; dfs(1,n-1); o*=1.001; for(int i=1;i<m;i++) { p[i]+=(f[i]-f[i+1])/o,p[i+1]-=(f[i]-f[i+1])/o; } }while(!check()); for(int i=1;i<=m;i++) printf("%.5f ",(double)p[i]); return 0; }
以上是关于Codeforces Gym 101174 J Risky Lottery 计算方法 逼近求值 dfs的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Gym 101174 B Within Arm's Reach 极角排序
Codeforces Gym 101174 I The White Rabbit Pocket Watch 模线性方程组