UVa-10820 Send a Table 欧拉函数

来源:互联网 发布:民间信贷数据 编辑:程序博客网 时间:2024/06/08 04:58

题意

交表 由于f(kx,ky) 可以由f(x,y)递推出来 让我们求 在x,y都不大于n的情况下
计算最少需要计算多少不同的项
n<=50000

分析

那么也就是说两个数由共因子的不必计算 只计算两个数没有共因子的 那么也就是说 每个数我们只需要找到与他互质的个数就可以了 欧拉函数线性筛
求欧拉函数复杂度O(n*logn*logn)

code

#include<bits/stdc++.h>using namespace std;const int maxn = 50010;int phi[maxn];void init(){    phi[1]=1;    for(int i=2;i<maxn;i++){        if(!phi[i])        for(int j=i;j<maxn;j+=i){            if(!phi[j])phi[j]=j;            phi[j] = phi[j]/i*(i-1);        }    }}int main(){    int n;    init();    while(scanf("%d",&n),n)    {        int ans=1;        for(int i=n;i>1;i--){//(1,1)就算一次就够了            ans+=phi[i]<<1;//符合条件的*2 (x,y)+(y,x)        }        printf("%d\n",ans);    }    return 0;}