UVA - 10820欧拉函数的应用

这是一道很基础的欧拉函数的题目

题意要求  (x,y) 互质 &&x<=n&&y<=n

 

求互质对数 可以运用容斥,求出 phi(n)=n(1-1/n1)(1-1/n2)......(1-1/nk);

因为(2,4) (4,2) 算两对,所以 答案为 2*f(n)+1;

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<math.h>
#include<map>
using namespace std;

#define MST(vis,x) memset(vis,x,sizeof(vis))
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define maxn  50010
#define mod  1000000007

int phi[maxn];
int main()
{

    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)break;
        MST(phi,0);
        phi[1]=1;
        for(int a=2; a<=n; a++)if(!phi[a])
            {
                for(int b=a; b<=n; b+=a)
                {
                    if(!phi[b])phi[b]=b;
                    phi[b]=phi[b]/a*(a-1);
                }
            }
        ll sum=0;
        for(int a=2; a<=n; a++)
            sum+=phi[a];
        printf("%lld\n",2*sum+1);
    }
    return 0;
}
View Code

 

posted @ 2017-08-14 20:08  被咬过的馒头  阅读(162)  评论(0编辑  收藏  举报