ACM-ICPC北京賽區2015網絡同步賽E:Stamps

鏈接
題意:Bob向Alice買郵票,每種郵票有無限張,Bob每次等概率選擇一種郵票買(可以買買過的),每次代價爲H[i][k] ,其中k 爲給定常數且k<10 ,H 的定義爲:

H(i,0)=1, i=1,2,...

H(i,k)=H(1,k1)+H(2,k1)+...+H(i,k1),k>0, i>0

問期望用多少錢可以集齊所有n 種郵票.n<=100000
#include<bits/stdc++.h>
using namespace std;
const int Maxn=100020,M=1e6+3;
int fac[Maxn],rev1[Maxn],rev2[Maxn];
int dp[Maxn][11];
int powmod(int x,int y)
{
    int ret=1;
    while(y){if(y&1)ret=1LL*ret*x%M;y>>=1;x=1LL*x*x%M;}
    return ret;
}
int main()
{
    fac[0]=fac[1]=1;
    for(int i=2;i<Maxn;i++)fac[i]=1LL*fac[i-1]*i%M;
    rev1[0]=rev1[1]=1;
    rev2[0]=rev2[1]=1;
    for(int i=2;i<Maxn;i++)rev1[i]=1LL*(M-M/i)*rev1[M%i]%M;
    for(int i=2;i<Maxn;i++)rev2[i]=1LL*rev2[i-1]*rev1[i]%M;
    for(int k=0;k<10;k++)
    {
        for(int n=1;n<Maxn;n++)
        {
            if(!k)dp[n][k]=(dp[n-1][k]+rev1[n])%M;
            else dp[n][k]=(dp[n-1][k]+1LL*rev1[n]*dp[n][k-1]%M)%M;
        }
    }
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF&&(n||k))
    {
        printf("%lld\n",1LL*dp[n][k]*powmod(fac[n],10)%M*powmod(n,k+1)%M);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章