UVA.10820 Send A Table (欧拉函数)

来源:互联网 发布:网络用语马克啥意思 编辑:程序博客网 时间:2024/06/06 16:24

UVA.10820 Send A Table (欧拉函数)

标签(空格分隔): 数论


题意分析

题面说的比较花里胡哨,最总要的是发现,需要打得的表的数字(x,y)满足gcd(x,y)=1,也就是说x,y互质。发现这个性质之后,就不是很难了。
规定x<y,可以将规模缩减一半,最后输出只需要乘2就好了,对于x=y的情况,发现只需要1,1,故乘2后最后结果需要+1即可。

代码总览

#include <bits/stdc++.h>#define nmax 50005#define N 50005#define ll long longusing namespace std;bool check[nmax];int prime[nmax];int phi[nmax];int tot;void getphi(){    memset(check,false,sizeof check);    int tot = 0;    phi[1] = 1;    for(int i = 2;i<=N;++i) {        if(!check[i]){            prime[tot++] = i;            phi[i]= i-1;        }        for(int j = 0;j<tot;++j) {            if( i * prime[j] > N ) break;            check[ i * prime[j] ] = true;            if( i % prime[j] == 0 ) {                phi[ i * prime[j] ] = phi[i] * prime[j] ;                break;            }else phi[i * prime[j]] = phi[i] * (prime[j] - 1);        }    }}int n;int main(){    getphi();    while(scanf("%d",&n) != EOF){        if(n == 0) break;        ll ans = 0;        for(int i = 2;i<=n;++i){            ans+=phi[i];        }        ans = ans *2 +1;        printf("%lld\n",ans);    }    return 0;}