找到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;
}
发表回复