POJ1284 Primitive Roots

http://poj.org/problem?id=1284

原根

一个质数的原根个数为\(\varphi(p-1)\)

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 100005
using namespace std;
int x;
bool pri[N];
int cnt,phi[N],prime[N];
int main()
{
    phi[1]=1;
    for (int i=2;i<=65536;i++)
    {
        if (!pri[i])
        {
            prime[++cnt]=i;
            phi[i]=i-1;
        }
        for (int j=1;j<=cnt;j++)
        {
            ll g=(ll)i*prime[j];
            if (g>65536)
                break;
            pri[g]=true;
            if (i%prime[j]==0)
            {
                phi[g]=phi[i]*prime[j];
                break;
            }
            phi[g]=phi[i]*(prime[j]-1);
        }
    }
    while (scanf("%d",&x)!=EOF)
        printf("%d\n",phi[x-1]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/GK0328/p/13397847.html