您的位置:首页 > 其它

UVA 11426 GCD - Extreme (II)

2016-09-03 22:29 309 查看
同一对儿公因数可以作为k*(i,j)的公因数。

找到递推关系。

每一项多出来的值都可以打表来得到,每一个不同的因数都会造成不同的结果。

题目链接:http://acm.hust.edu.cn/vjudge/problem/18553

#include<stdio.h>
#include<string.h>
#define MAXD 4000010
const int N = 4000000;
typedef long long LL;
int phi[MAXD];
LL a[MAXD];
void prep()
{
memset(a, 0, sizeof(a));
for(int i = 1; i <= N; i ++) phi[i] = i;
for(int i = 2; i <= N; i ++)
{
if(phi[i] == i)
{
for(int j = i; j <= N; j += i)
phi[j] = phi[j] / i * (i - 1);
}
for(int j = 1; j * i <= N; j ++)
a[j * i] += j * phi[i];
}
for(int i = 1; i <= N; i ++) a[i] += a[i - 1];
}
int main()
{
prep();
int n;
while(scanf("%d", &n), n) printf("%lld\n", a
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: