题目:http://codeforces.com/contest/839/problem/D
题意:找出所有gcd>1的集合,strength 为集合大小*gcd,计算所有的strength
思路:
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9+7;
const int N = 1e6;
int n,x;
ll a[N+5],b[N+5],p[N+5];
void solve()
{
for(int i = 2;i <= N;i++)
p[i] = i;
for(int i = 2;i <= N;i++)
for(int j = i*2;j <= N;j += i)
p[j] -= p[i];
ll ans = 0,num = 0;
for(int i = 2;i <= N;i++)
{
num =0;
for(int j = i;j <= N;j+=i)
num += a[j];
if(!num)
continue;
ans = (ans + ((num * b[num-1]) % MOD * p[i])% MOD )% MOD;
}
printf("%lld\n",ans);
}
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
scanf("%d",&x);
a[x]++;
}
ll y = 1;//2的n次幂
for(int i = 0;i <= N;i++)
{
b[i] = y;
y = y*2 % MOD;
}
solve();
return 0;
}