思路非常简单!
先对所有的数取模
对于取模后的值相同的数来说,它们的差都为K的倍数
然后用排列组合就解决了
!!
注意,求排列组合时有非常容易犯的错误!
那就是如果取余就不要再算除法了!!
那样是错误的
因为给的数据也不大,所以计算组合数的时候不取余数也对
也可以用
c[i][j]=c[i-1][j]+c[i-1][j-1]
来先预处理出所有的组合数
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int mod=1000000009;
long long com(long long m,long long n)
{
long long i,j,sum=1;
for (i=m,j=0;j<n;j++,i--)
{
sum=sum*i/(j+1);
}
return sum;
}
long long abs0(long long a)
{
if(a<0)
return -a;
else
return a;
}
long long num[1005],sum[1005];
int main()
{
long long n,m,k;
scanf("%lld%lld%lld",&n,&m,&k);
for(long long i=1; i<=n; i++)
{
scanf("%lld",&num[i]);
}
memset(sum,0,sizeof(sum));
for(long long i=1; i<=n; i++)
{
sum[num[i]%k]++;
}
long long ans=0;
for(long long i=0; i<=k; i++)
{
if(sum[i]>=m)
ans=(ans+com(sum[i],m))%mod;
}
printf("%lld\n",ans);
}