您的位置:首页 > 其它

Codeforces Round #428 (Div. 2) D. Winter is here

2017-08-13 20:34 423 查看
题目: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: