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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章