UVA 10820 Send a Table 歐拉函數制phi表 累加sum

題目鏈接:http://www.bnuoj.com/v3/problem_show.php?pid=19238


題意:統計n中有多少個f(x,y),x,y<=n,但是如果f(kx,ky)則不要統計,如n=2,有(1,1),(1,2),(2,1) 3個

思路:其實是一個二元組(x,y),滿足x,y互質而已。

做法:需要從1~n的每個數的歐拉函數值的累加,即把所有x<y<=n的情況求出來,然後讓sun*2-1,乘2是因爲有對稱的x>y的情況,-1是因爲(1,1)不要乘2

代碼:


/*
題意:統計n中有多少個f(x,y),x,y<=n,但是如果f(kx,ky)則不要統計,如n=2,有(1,1),(1,2),(2,1) 3個
思路:其實是一個二元組(x,y),滿足x,y互質而已。
做法:需要從1~n的每個數的歐拉函數值的累加,即把所有x<y<=n的情況求出來,然後讓sun*2-1,乘2是因爲有對稱的x>y的情況,-1是因爲(1,1)不要乘2
代碼:
*/
#include<cstring>
#include<cstdio>
using namespace std;
const int MAX = 50001+2;
int phi[MAX],n;
void phi_table() //歐拉phi函數表
{
    memset(phi,0,sizeof(phi));phi[1]=1;
    for(int i=2;i<=MAX;++i) if(!phi[i])
        for(int j=i;j<=MAX;j+=i){
            if(!phi[j]) phi[j]=j;
            phi[j]=phi[j]/i*(i-1);
    }
}
int main()
{
    phi_table();
    while(scanf("%d",&n)&&n!=0)
    {
        int sum=0;
        for(int i=1;i<=n;++i) sum+=phi[i]; //累加1-n的phi值
        printf("%d\n",sum*2-1);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章