找到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;}