【题意】 小葱想知道如果给定
n,m,k
,对于所有的
0<=i<=n,0<=j<=min(i,m)
有多少对
C(i,j)
满足是
k
<script type="math/tex" id="MathJax-Element-38">k</script>的倍数。
题解:
想当年我不会做,现在想看看会不会。直接暴力预处理出每个C%k的余数就好了……再求一下前缀和……当时的我竟然不会做……现在十几分钟就AC了……
代码:
#include<cstdio>
#include<cstring>
const int maxn=
2010;
int t,k,n,m,C[maxn][maxn],sum[maxn][maxn];
void work()
{
C[
0][
0]=
1;
for(
int i=
1;i<=
2000;i++)C[i][
0]=
1;
for(
int i=
1;i<=
2000;i++)
for(
int j=
1;j<=i;j++)
C[i][j]=(C[i-
1][j]+C[i-
1][j-
1])%k;
for(
int j=
1;j<=
2000;j++)
{
sum[j-
1][j]=
0;
for(
int i=j;i<=
2000;i++)
{
sum[i][j]=sum[i-
1][j];
if(C[i][j]==
0)sum[i][j]++;
}
}
}
int main()
{
scanf(
"%d%d",&t,&k);
work();
while(t--)
{
int ans=
0;
scanf(
"%d%d",&n,&m);
for(
int j=
0;j<=m;j++)
ans+=sum[n][j];
printf(
"%d\n",ans);
}
}