题目描述:
求 ∑ki=0C(n,i) mod p ∑ i = 0 k C ( n , i ) m o d p
题目分析:
P 很小 而且为一个质数 卢卡斯定理没跑了
C(n,m) mod p=C(n%p,m%p)∗C(n/p,m/p) mod p
C
(
n
,
m
)
m
o
d
p
=
C
(
n
%
p
,
m
%
p
)
∗
C
(
n
/
p
,
m
/
p
)
m
o
d
p
预处理小于mod的 S与C即可…
题目链接:
Ac 代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#define mod 2333
#define ll long long
int c[mod+10][mod+10],s[mod+10][mod+10];
int t;
ll n,k;
int C(ll n,ll m)
{
if(n<m||m<0) return 0;
if(n<mod&&m<mod) return c[n][m];
return (C(n/mod,m/mod)*c[n%mod][m%mod])%mod;
}
inline int Lucas(ll n,ll k)
{
if(k<0) return 0;
return ((Lucas(n/mod,k/mod-1)*s[n%mod][mod-1])%mod+(C(n/mod,k/mod)*s[n%mod][k%mod])%mod)%mod;
}
inline void init()
{
for(int i=0;i<mod;i++)
{
s[i][0]=c[i][0]=c[i][i]=1;
for(int j=1;j<i;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
for(int j=1;j<mod;j++)
s[i][j]=(s[i][j-1]+c[i][j])%mod;
}
}
int main()
{
init();
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&k);
printf("%d\n",Lucas(n,k));
}
return 0;
}