找到n个数中 有几对 两个数之和为7的倍数
//(相比两层for循环时间复杂度仅为O(N)的改进算法)
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<cstdio>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
using namespace std;
int main(){
int n;//要输入n个数来找和为7的数的数对
scanf("%d",&n);
long long num[20];//定义一个数组去存%7取余后余数为i的个数,20是随意定的,>=7就行,因为任何数对7取余都小于7
for(int i = 0; i < 20; i++){
num[i] = 0;//初始化一下,%7余数为i的个数都是0
}
for(int i = 1; i <= n; i++){
int x;//输入n个数
scanf("%d",&x);
num[x%7]++;//记录余数为某个数i的个数,更新对应的num[i]的值来记录
}
long long sum = 0;
sum += (num[0] *(num[0] - 1)/2);//对7取余为0的比较特殊(因为14+14,7+7等满足条件但却不是一对数(应为不等的一对数))
//故满足条件的数是7,14,21等排列组合得到的个数为n*(n-1)/2
sum += (num[1] * num[6]);//对7取余为1的个数与对7取余为6的个数相乘得到 1和6 总对数(对7取余为1的数与对7取余为6的数相加肯定是7的倍数)
sum += (num[2] * num[5]);//同理
sum += (num[3] * num[4]);//同理
printf("%lld\n",sum);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。