uva 11426 GCD Extreme (II)

来源:互联网 发布:淘宝售后客服 编辑:程序博客网 时间:2024/04/30 15:04

白书上说的很清楚了,自己在巩固一下。

gcd(x,n) = i 的充要条件是 gcd(x/i,n/i)= 1。

所以计算f[n] 的时候,当 i 为因子时,满足gcd(x,n) = i 的x的个数(x < n) 就等于 n/i 的欧拉函数。

#include <iostream>#define N 4000010#include<stdio.h>#include<cstring>using namespace std;int phi[N];long long S[N]; //要求的结果 S[n] = S[n - 1]+f[n]long long f[N]; //gcd(1,n)+gcd(2,n)+...+gcd(n-1,n)void phi_table(){    for(int i = 2;i <= N;i++) phi[i] = 0;    phi[1] = 1;    for(int i = 2;i <= N;i++) if(!phi[i])        for(int j = i;j <= N;j+=i)        {            if(!phi[j]) phi[j] = j;            phi[j] = phi[j]/i*(i-1);        }}void pre_produce(){    memset(f,0,sizeof f);    for(int i = 1;i <= N;i++)        for(int n = i*2;n <= N;n+=i) f[n]+=i*phi[n/i];    S[2] = f[2];    for(int i = 3;i <= N;i++) S[i] = S[i - 1]+f[i];}int main(){    int n;    phi_table();    pre_produce();    while(scanf("%d",&n),n)    {        printf("%lld\n",S[n]);    }    return 0;}


0 0
原创粉丝点击