@sensitive-cs
        
        2016-10-04T15:44:47.000000Z
        字数 598
        阅读 933
    从n个数中任取两个数相加等于0,求取法。
独立记录0的个数,然后利用组合公式。对于相反数用两个数记录组-10到10每个数的个数,最后用一个循环相乘,还是相当于分布乘法原理嘛。
由于数据范围够大,所以每个long long,血的教训。
#include <stdio.h>#include <math.h>#define M 100000int a[M];long long b[11];long long c[11];long long zero = 0;int main(){long long n;while (scanf("%I64d",&n) != EOF){long long i = 0,j = 0;long long sum = 0;for (i = 1;i <= 10;i++){b[i] = 0;c[i] = 0;}for (i = 0;i < n;i++){scanf("%d",&a[i]);for (j = 1;j <= 10;j++){if (a[i] == j)b[j]++;}if (a[i] == 0)zero++;for (j = -1;j >= -10;j--){if (a[i] == j)c[(int)fabs(j)]++;}}for (i = 1;i <= 10;i++)sum += b[i] * c[i];if (zero > 1)sum += ((zero - 1)*zero / 2);printf("%I64d\n",sum);}return 0;}