给定n个整数和一个整数k,告诉有多少对给定的n个整数存在,使得这对中两个元素的和可被k整除?
我不知道n和k的范围。为了简单起见,假设n和k不是很大。
不用说,尽可能提供最优解(我知道朴素方法 :-)!)
给定n个整数和一个整数k,告诉有多少对给定的n个整数存在,使得这对中两个元素的和可被k整除?
我不知道n和k的范围。为了简单起见,假设n和k不是很大。
不用说,尽可能提供最优解(我知道朴素方法 :-)!)
两个数之和是否能被k
整除,仅取决于它们对k
取余的结果。
因此,如果k
相对较小,您可以计算每个可能余数的数字数量,并从中计算出成对数量。假设k > 0
且所有整数均为非负数。
unsigned long long combinations(unsigned k, unsigned long long *arr, unsigned n) {
unsigned long long counts[k] = {0};
unsigned i;
for(i = 0; i < n; ++i) {
++counts[arr[i]%k];
}
// number of pairs where both are divisible by k
unsigned long long combs = counts[0]*(counts[0]-1)/2;
for(i = 1; i < (k+1)/2; ++i) {
combs += counts[i]*counts[k-i];
}
if (k == 2*i) {
combs += counts[i]*(counts[i] - 1)/2;
}
return combs;
}
该算法在O(n+k)
步内完成。如果n
较小而k
很大,则朴素算法更好。
combs
的初始化中使用了counts[0]
,我没有忘记(但是我还有一个错别字,“k-1”而不是“k-i”)。 - Daniel Fischer