UVA10820欧拉函数求互质的对数

题意:
给出n,算出小于等于n的所有数中,有几对互质;

思路:
利用欧拉函数求与x互质的数的个数prime[x],再将prime[x]递推累加prime[x]=prime[x]+prime[x-1],因为题意answer(x,y)和answer(y,x)都可以,所以结果乘以2,然而answer(1,1)重复一次,所以结果prime[x]=prime[x]*2-1;
欧拉函数:

通式:
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1(唯一和1 互质的数(小于等于1)就是1本身)。
注意:每种质因数只一个。 比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
若n是质数p的k次幂,
,因为除了p的倍数外,其他数都跟n互质。
设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值
φ:N→N,n→φ(n)称为欧拉函数。
欧拉函数是 积性函数——若m,n互质,
特殊性质:当n为奇数时,
, 证明与上述类似。
若n为质数则


代码:

//#include <bits/stdc++.h>
using namespace std;

const int N = 50005;
int prime[N];
void solve()
{
    prime[1] = 1;
    for(int i = 2; i <= N; i++)
    {
        if(!prime[i])
        {
            for(int j = i; j <= N; j+=i)
            {
                if(!prime[j])
                    prime[j] = j;
                prime[j] = prime[j]/i * (i-1); 
            }
        }
    }
    for(int i = 2; i <= N; i++)
    {
        prime[i] = prime[i]+prime[i-1];
    }
}
int main()
{
    solve();
    int x;
    while(scanf("%d", &x)&&x)
    {
        printf("%d\n", prime[x]*2-1);
    }
}


猜你喜欢

转载自blog.csdn.net/qihang_qihang/article/details/79450644
今日推荐