从小到大排序
首先答案可以化简为下面这个
假设gcd(a[ i ],a[ j ])=a,则贡献为(n-i)*a,(反演公式
考虑a[ i ]前面所有a[ j ]的对贡献
假设a[ i ]=12,a[ j ]=8,最大公因数是4,考虑成4=
a[ j -1 ]=6,最大公因数是6,考虑成6=
如果只考虑a[ j ]=8和a[ j -1 ]=6相当于
即在前面遍历过a[ j ]的时候对a[ j ]的所有因子d,cnt[ d ]++;
a是a[ i ]的因子,故d即也是a[ i ]的因子
则可以表示成
#include<bits/stdc++.h>
#define int long long
using namespace std;
int euler_phi(int n) {
int ans = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0) n /= i;
}
if (n > 1) ans = ans / n * (n - 1);
return ans;
}
void solve() {
int n;
cin >> n;
vector<int> a(n + 1);
map<int, int> cnt;
for (int i = 1; i <= n; i++)cin >> a[i];
sort(a.begin() + 1, a.end());
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j * j <= a[i]; j++) {
if (a[i] % j)continue;
ans += euler_phi(j)*cnt[j] * (n - i);
cnt[j]++;
if (j * j == a[i])continue;
ans += euler_phi(a[i] / j)*cnt[a[i]/j] * (n - i);
cnt[a[i] / j]++;
}
}
cout << ans << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
for(cin>>t;t--;)solve();
return 0;
}