@sensitive-cs
2016-10-04T23:44:47.000000Z
字数 598
阅读 776
从n个数中任取两个数相加等于0,求取法。
独立记录0的个数,然后利用组合公式。对于相反数用两个数记录组-10到10每个数的个数,最后用一个循环相乘,还是相当于分布乘法原理嘛。
由于数据范围够大,所以每个long long,血的教训。
#include <stdio.h>
#include <math.h>
#define M 100000
int 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;
}