hdu4992 Primitive Roots(所有原根)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4992
题意:给出n,输出n的所有原根。
思路:求出n的一个原根x,那么对于所以的i,i<phi(n)且(i,phi(n))=1,x^i%n都是n的原根。
int Euler(int n)
{
int i,ans=n;
for(i=2;i*i<=n;i++) if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
int prime[N],tag[N],cnt;
void init()
{
int i,j;
for(i=2;i<N;i++) if(!tag[i])
{
prime[cnt++]=i;
for(j=i+i;j<N;j+=i) tag[j]=1;
}
tag[1]=1;
}
int get(int x)
{
if(x%2==0) return 0;
int i;
for(i=0;i<cnt&&prime[i]*prime[i]<=x;i++) if(x%prime[i]==0)
{
while(x%prime[i]==0) x/=prime[i];
if(x!=1) return 0;
return prime[i];
}
return x;
}
int n;
int myPow(i64 x,i64 y)
{
i64 ans=1;
while(y)
{
if(y&1) ans=ans*x%n;
x=x*x%n;
y>>=1;
}
return (int)ans;
}
int ee;
vector<int> V;
int ok(int t)
{
if(myPow(t,ee)!=1) return 0;
int i;
FOR0(i,SZ(V)) if(myPow(t,V[i])==1) return 0;
return 1;
}
int Gcd(int x,int y)
{
if(y==0) return x;
return Gcd(y,x%y);
}
int main()
{
init();
while(scanf("%d",&n)!=-1)
{
if(n==2)
{
puts("1");
continue;
}
if(n==4)
{
puts("3");
continue;
}
int t=n%2==0?get(n/2):get(n);
if(!t)
{
puts("-1");
continue;
}
ee=Euler(n);
V.clear();
int i;
for(i=2;i*i<=ee;i++) if(ee%i==0)
{
V.pb(i);
if(i*i!=ee) V.pb(ee/i);
}
for(i=2;i<n;i++) if(ok(i)) break;
int Min=i;
vector<int> ans;
for(i=1;i<ee;i++)
{
if(Gcd(i,ee)!=1) continue;
ans.pb(myPow(Min,i));
}
sort(all(ans));
for(i=0;i<SZ(ans);i++)
{
if(i) putchar(' ');
printf("%d",ans[i]);
}
puts("");
}
}
hdu4992 Primitive Roots(所有原根)的更多相关文章
- 【HDU 4992】 Primitive Roots (原根)
Primitive Roots Description We say that integer x, 0 < x < n, is a primitive root modulo n i ...
- POJ 1284 Primitive Roots 数论原根。
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2479 Accepted: 1385 D ...
- poj 1284 Primitive Roots (原根)
Primitive Roots http://poj.org/problem?id=1284 Time Limit: 1000MS Memory Limit: 10000K Descr ...
- POJ_1284 Primitive Roots 【原根性质+欧拉函数运用】
一.题目 We say that integer x, 0 < x < p, is a primitive root modulo odd prime p if and only if t ...
- POJ 1284:Primitive Roots 求原根的数量
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3381 Accepted: 1980 D ...
- [POJ1284]Primitive Roots(原根性质的应用)
题目:http://poj.org/problem?id=1284 题意:就是求一个奇素数有多少个原根 分析: 使得方程a^x=1(mod m)成立的最小正整数x是φ(m),则称a是m的一个原根 然后 ...
- poj 1284 Primitive Roots(原根+欧拉函数)
http://poj.org/problem?id=1284 fr=aladdin">原根 题意:对于奇素数p,假设存在一个x(1<x<p),(x^i)%p两两不同(0&l ...
- POJ 1284 Primitive Roots 原根
题目来源:POJ 1284 Primitive Roots 题意:求奇素数的原根数 思路:一个数n是奇素数才有原根 原根数是n-1的欧拉函数 #include <cstdio> const ...
- POJ 1284:Primitive Roots(素数原根的个数)
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5709 Accepted: 3261 Descr ...
随机推荐
- android- Auto Monitor Logcat
启动模拟器的时候弹出窗体: 它实在询问你是否显示logcat视图以便显示此工作空间中的程序信息. 因为如何程序错误,可以从logcat中看到错误的原因,建议选择yes. 单击确定,你会发现多了一个Lo ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON OverpaintRegion1
zw版[转发·台湾nvp系列Delphi例程]HALCON OverpaintRegion1 unit Unit1;interfaceuses Windows, Messages, SysUtils, ...
- html规范整体结构
<!DOCTYPE html><html lang="zh"><head> <meta charset="utf-8" ...
- JS 字符串转日期格式 日期格式化字符串
/** * @author 陈维斌 http://www.cnblogs.com/Orange-C/p/4042242.html%20 3 * 如果想将日期字符串格式化,需先将其转换为日期类型Date ...
- jsp页面的跳转取值
<p >工单管理 >> <c:if test="${code eq 0}">全部工单>>详情页</c:if> <c ...
- innodb double write buffer
两次写是innodb的一个重要特性,目的是为了保证在异常down机或者没电的情况下,保证数据的安全可靠.一次是往内存的double write buffer中写,一次是在刷共享表空间的连续128个页. ...
- Linux MTD系统剖析【转】
转自:http://blog.csdn.net/lwj103862095/article/details/21545791 版权声明:本文为博主原创文章,未经博主允许不得转载. MTD,Memory ...
- org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.servlet.Servlet
java.lang.ClassCastException: org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.se ...
- 正则表达式用户名密码电话身份证Email使用
月末了,这个月才写了2遍文章,对自己略感失望了,最近是有些忙,等闲些日子后,再整理一些文章分享给大家! 这遍是关于正则表达式,因为写项目时要用到正则表达式,所以就学习了下,另写一遍文章,方便记忆! 1 ...
- MySQL存储引擎之InnoDB
一.The InnoDB Engine Each InnoDB table is represented on disk by an .frm format file in the database ...