AC通道:http://vjudge.net/problem/POJ-1284
【题目大意】给你一个素数n,求n的原根个数。
【题解】
关于原根有一个定理:
定理:如果模有原根,那么它一共有
个原根。
所以这题就是求phi[phi[n]]
很简单吧。。。(如果知道这个定理的话)
/**************
POJ 1284
by chty
2016.11.10
**************/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
#define FILE "read"
#define MAXN 70010
int n,cnt,prime[MAXN],isprime[MAXN],phi[MAXN];
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
void get()
{
phi[1]=1;
for(int i=2;i<=70000;i++)
{
if(!isprime[i]) prime[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&prime[j]*i<=70000;j++)
{
isprime[prime[j]*i]=1;
if(i%prime[j]==0) {phi[prime[j]*i]=phi[i]*prime[j];break;}
else phi[prime[j]*i]=phi[i]*(prime[j]-1);
}
}
}
int main()
{
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
get();
while(~scanf("%d",&n)) printf("%d\n",phi[phi[n]]);
return 0;
}

本文介绍了一种快速计算给定素数n的原根个数的方法,利用数论中的一个重要定理,并通过实现相应的算法来求解问题。
945

被折叠的 条评论
为什么被折叠?



