hdu 3944 DP?

来源:互联网 发布:网络报警平台网络诈骗 编辑:程序博客网 时间:2024/05/22 14:30

点这里

TLE到WA。。

改了无数次的代码。。

最后差在取模少了一次

看了题解就一直被题解牵着走。。

。。。解释有大佬的博客写的很清楚

。。记个教训

#include <iostream>#include <stdio.h>#include <string.h>using namespace std;typedef long long ll;int f[10005][10005],mf[10005][10005];int prime[10005];bool vis[10005];int cnt=0,tt[10005]; int mod;void prime1(){    int i,j;    memset(vis,true,sizeof(vis));    memset(tt,0,sizeof(tt));    for(i=2;i<10005;i++)    {        if(vis[i])        {            prime[++cnt]=i;            tt[i]=cnt;            for(j=i+i;j<10005;j+=i)            {                vis[j]=false;            }        }    }}int quickmod(int a,int b,int m){    int ans=1;    a%=m;    while(b)    {        if(b&1)            ans=ans*a%m;        b>>=1;        a=a*a%m;    }    return ans;}void init(){    for(int i=1;i<=cnt;i++)    {        f[i][0]=mf[i][0]=1;        for(int j=1;j<prime[i];j++)        {            f[i][j]=(f[i][j-1]*j)%prime[i];           mf[i][j]=quickmod(f[i][j],prime[i]-2,prime[i]);        }    }}//1000000000 99999999 9901//9002int ys(int n,int m){    if(m>n) return 0;    if(m==n) return 1;    int hh=tt[mod];   //cout<<tt[mod]<<" "<<n<<" "<<m<<endl;  //  printf("#%d %d %d %d \n",f[hh][n],mf[hh][n-m],mf[hh][m],(f[hh][n]*(mf[hh][m]*mf[hh][n-m])%mod)%mod);    return f[hh][n]*(mf[hh][m]*mf[hh][n-m]%mod)%mod;}int lucas(int n,int m){    if(m==0) return 1;    return ys(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;}int main(){    int n,k;       prime1();       init();       int d=1;    while(~scanf("%d%d%d",&n,&k,&mod))    {        if(k<=n/2) k=n-k;         printf("Case #%d: %d\n",d++,(k%mod+lucas(n+1,k+1)%mod)%mod);    }    return 0;}


原创粉丝点击