参考http://blog.csdn.net/lyhvoyage/article/details/45306211
题目大意:给出n个数,求gcd(a[i], a[j]) * gcd(a[i], a[j] - 1)的和.
两数互素,gcd(a[i], a[j]) * gcd(a[i], a[j] - 1)为0;
求任意一个以x为gcd的数对在数列中有k,则最多有k*k个数对的gcd为x,又已知两个数,如果他们都是 x 的倍数,那么他们的 gcd 一定也是 x 的倍数,即他们的gcd为x, 2x, …;
所以用f(x) 表示以 x 为 gcd 的数对个数。
f(x) = k^2 - f(2x) - f(3x) - f(4x) … f(tx) (tx <= 10000, k = Cnt[x])
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#define LL __int64
#define MAX 0x3f3f3f3f
#define MOD 10007
#define N (10000 + 5)
using namespace std;
int a[N], b[N];
int main()
{
int n;
while (~scanf("%d", &n))
{
memset(a, 0, sizeof(a));
for (int i = 0; i < n; i++)
{
int t;
scanf("%d", &t);
for (int j = 1; j * j <= t; j++)
{
if (t % j == 0)
{
a[j]++;
if (j * j != t)
{
a[t/j]++;
}
}
}
}
int ans = 0;
for (int i = 10000; i >= 1; i--)
{
b[i] = a[i] * a[i] % MOD;
for (int j = i * 2; j <= 10000; j += i)
{
b[i] = (b[i] - b[j] + MOD) % MOD;
}
ans = (ans + (i * (i - 1) % MOD * b[i] % MOD)) % MOD;
}
printf("%d\n", ans);
}
}