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 模线性方程组

Gym 101174D Dinner Bet(概率DP)题解

Passwords Gym - 101174E

Gym101174B Bribing Eve

codeforces gym 100357 H (DP 高精度)