UVa:10820 Send a Table

欧拉函数。

稍微一想就能发现只要x,y两个数互质那么统计在内。这样求1到n所有的欧拉函数值然后乘以2,表示(x,y)(y,x)两种情况,另外要减去1,因为(1,1)这种情况算了两次。得到的就是答案。

这里用了LRJ白书上类似筛素数的办法求欧拉函数值,由每个素数出发乘进它被整除的数里面,最后所有素数可以构成它的欧拉函数值。感觉甚是厉害,慢慢领悟一下。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 50000
#define INF 2139062143
#define ll long long
using namespace std;
int phi[MAXN+5];
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=0;
        for(int i=1; i<=n; ++i)
            ans+=phi[i];
        printf("%d\n",ans*2-1);
    }
    return 0;
}


 

你可能感兴趣的:(数学,欧拉函数)