您的位置:首页 > 其它

UVA 11426 GCD - Extreme (II)

2015-04-27 10:14 197 查看
题目大意:

  

求G的值,其中1<N<4000001;

解题思路:

  假设[1,n-1]中所有的数分别与n的gcd的和记为b
,可以看出G
= G[n-1] + b


这样就把题目转换为了求b


假设a[x]表示使gcs(n, b) = x成立的b有多少个,b
= a[x1]*x1 + a[x2]*x2 + ...... + a[xk]*xk。

我们只需要求a
.

因为有gcd的性质:gcd(n, b) = x --> gcd(n/x, b/x) = 1;可以用欧拉函数求出a[n/xi]即可。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

#define maxn 4000005
#define LL long long
LL a[maxn], b[maxn], dp[maxn];

int main()
{
int n, i, j;
for (i=2; i<maxn; i++)
if (!a[i])
for (j=i; j<maxn; j+=i)
{
if (!a[j])
a[j] = j;
a[j] = a[j] / i * (i-1);
}
//欧拉函数打表
for (i=1; i<maxn; i++)
for (j=i*2; j<maxn; j+=i)
b[j] += a[j/i]*i;
//[1,n-1]中所有的数与n的gcd的和
for (i=2; i<maxn; i++)
dp[i] = dp[i-1]+b[i];
//题目所问
while (scanf ("%d", &n), n)
printf ("%lld\n", dp
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: