Time Limit: 1 Sec Memory Limit: 128 Mb
Description
给你一个有N个整型数字的序列A,整数对(i, j)满足以下条件,请问能找到多少这样的整数对:
-
1 ≤ i, j ≤ N
-
Ai−Aj 是200的整数倍
Input
第一行输入N,第二行输入N个整数分别A1 A2 … AN
-
所有输入均为整型(int)
-
2 ≤ N ≤ 2 × 10^5
-
1 ≤ Ai ≤ 10^9
Output
输出答案并换行
Sample Input
6
123 223 123 523 200 2000
Sample Output
4
代码实现
#include <stdio.h>
/*
因为是200的整数倍,设置一个长度为200的数组
像hash排序一样,%200后余数相等的两数相减后可为200的整数倍数
每个数组下标中的数排列组合
*/
//求组合数
int C(int n, int m)
{
if (n == 0 || n == m)
{
return 1;
}
else
{
//组合数递推公式:C(n,m)=C(n-1,m-1)+C(n,m-1)
return C(n - 1, m - 1) + C(n, m - 1);
}
}
int main()
{
int n;
scanf("%d", &n);
int num_200[201];
for (int i = 0; i < 201; i++)
{
num_200[i] = 0;//初始化为0
}
for (int i = 0; i < n; i++)
{
int data;
scanf("%d", &data);
num_200[data % 200]++;
}
int count = 0;
for (int i = 0; i < 200; i++)
{
if (num_200[i] >= 2)
{
count += C(2, num_200[i]);
}
}
printf("%d\n", count);
}