给定N个整数A1, A2, ... AN,小Hi希望从中选出M个整数,使得任意两个选出的整数的差都是K的倍数。
请你计算有多少种不同的选法。由于选法可能非常多,你只需要输出对1000000009取模的结果。
Input第一行包含三个整数N、M和K。
第二行包含N个整数A1, A2, ... AN。
对于30%的数据,2 ≤ M ≤ N ≤ 10
对于100%的数据,2 ≤ M ≤ N ≤ 100 1 ≤ K, Ai ≤ 100
Output一个整数表示答案。
5 3 2 1 2 3 4 5Sample Output
1
思路:余数相同的数,两两之差一定是k的倍数,在余数相同的里面取M,利用数学组合数。
代码参考:
#include <iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#define max(a,b) a>b?a:b
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int main()
{
int a[110];
int N,M,K;
while(~scanf("%d%d%d",&N,&M,&K))
{
memset(a,0,sizeof(a));
int n;
ll A,B,ans=0;
for(int i=0;i<N;i++)
{
scanf("%d",&n);
a[n%K]++;
}
for(int i=0;i<K;i++)
{
A=1;
B=1;
if(a[i]<M)
continue;
for(int j=M+1;j<=a[i];j++)
{
A=A*j;
while (A%B==0&&B<=(a[i]-M))
{
A=A/B;
B++;
}
}
ans+=(A%1000000009);
}
printf("%lld\n",ans);
}
return 0;
}