给定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
题目意思很好理解,就是要从一堆数中找出m个数,使得它们两两之间的差为k的倍数
设x,y这两个数满足题目要求,所以 (x - y)% k = 0
(x % k) - (y % k) = 0
x%k = y % k
所以我们只要把对k取余后余数相等的数归为一类然后求用组合的公式来求就可以了,这里分子分母不能分开求,我也不知道为什么,wr了无数次
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 1000000009;
ll jie(ll num, ll m)
{
ll ans = 1;
for(ll i = 1; i <= m; i ++){
ans = ans * (num - i + 1) / i;
}
return ans % inf;
}
ll sum = 0;
ll yu[110];
int main()
{
ll n,m,k;
scanf("%lld %lld %lld", &n, &m, &k);
for(int i = 0; i < n; i ++){
ll val;
scanf("%lld", &val);
yu[val % k] ++;
}
ll ans = 0;
for(int i = 0; i < k ; i ++){
//cout << yu[i] <<endl;
if(yu[i] >= m){
ans += jie(yu[i], m);
//cout << ans << endl;
ans %= inf;
}
}
cout << ans % inf<< endl;
return 0;
}