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
//9002
int 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;
}