HDU4992 求所有原根
Primitive Roots
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 583 Accepted Submission(s): 144
Each line of the input contains a positive integer n. Input is terminated by the end-of-file seperator.
- 有原根的数只有2,4,p^n,2p^n(p为质数,n为正整数)。
- 一个数的最小原根的大小是O(n0.25)的。
- 如果g为n的原根,则gd为n的原根的充要条件是(d,φ(n))=1;
- 如果n有原根,它的原根个数为φ(φ(n))。
那么来看一下这道题:
首先根据性质1,我们可以通过预处理质数,把不存在的情况判掉。
然后根据性质3,找到一个原根后枚举次方判gcd就可以了。
怎么找到一个原根呢?按照性质2傻傻去跑在这种多组数据的题目里是肯定不行的。
那么有一个喜大普奔的结论来帮助我们:
因为gφ(n)≡1(mod n),而对于比φ(n)小的数都不成立。
枚举φ(n)的质因子p,看gφ(n)/p在模意义下是否是1。
是1的话g就不是原根。
证明起来有点麻烦,这里就不写了。
所以找原根大概是O(n0.25/2)的。
找到之后枚举次方就可以了,因为是充分条件。
想剪个好枝却剪烂的某人在HDU上留下了5个WA... ...
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#define LL long long int
#define ls (x << 1)
#define rs (x << 1 | 1)
#define MID int mid=(l+r)>>1
using namespace std; const int N = 1000000+10;
int P[N],vis[N],phi[N],tot,n; inline int gcd(int a,int b){return b?gcd(b,a%b):a;} inline void prepare()
{
phi[1]=1;
for(int i=2;i<N;++i){
if(!vis[i])P[++tot]=i,phi[i]=i-1;
for(int j=1;j<=tot;++j){
if(i*P[j]>=N)break;
vis[i*P[j]]=1;
if(i%P[j])phi[i*P[j]]=phi[i]*phi[P[j]];
else{phi[i*P[j]]=phi[i]*P[j];break;}
}
}
} inline int QPow(int d,int z,int Mod)
{
int ans=1;
for(;z;z>>=1,d=1ll*d*d%Mod)if(z&1)ans=1ll*ans*d%Mod;
return ans;
} inline bool check(int x)
{
if(x==2 || x==4)return 1;
if((x&1)^1)x>>=1;
for(int i=2;P[i]<=x;++i)
if(x%P[i]==0){
while(x%P[i]==0)x/=P[i];
return x==1?P[i]:0;
}
return 0;
} inline int get_rg(int fx)
{
int pt[1010],tt=0,Txd=phi[fx];
for(int i=1;P[i]*P[i]<=Txd;++i)
if(Txd%P[i]==0){
pt[++tt]=P[i];
while(Txd%P[i]==0)Txd/=P[i];
}
if(Txd!=1)pt[++tt]=Txd;
for(int i=2;i<=fx;++i)
if(QPow(i,phi[fx],fx)==1){
int flag=1;
for(int j=1;j<=tt;++j)
if(QPow(i,phi[fx]/pt[j],fx)==1){
flag=0;break;
}
if(flag)return i;
}
return 0;
} inline void work(int fx)
{
int tt=0,pr[N];
if(fx==2){printf("1\n");return;}
if(fx==4){printf("3\n");return;}
int T=check(fx);
if(!T){printf("-1\n");return;}
int g=get_rg(fx);
for(int i=1,k=g;i<phi[fx];++i,k=1ll*k*g%fx)
if(gcd(i,phi[fx])==1)
pr[++tt]=k;
sort(pr+1,pr+tt+1);
for(int i=1;i<tt;++i)
printf("%d ",pr[i]);
printf("%d",pr[tt]);
printf("\n");
} int main()
{
prepare();
while(scanf("%d",&n)!=EOF)work(n);
return 0;
}
HDU4992 求所有原根的更多相关文章
- 51nod1135(求最小原根)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1135 题意:中文题诶- 思路:设m是正整数,a是整数,若a模 ...
- 2018秦皇岛ccpc-camp Steins;Gate (原根+FFT)
因为给定的模数P保证是素数,所以P一定有原根. 根据原根的性质,若\(g\)是\(P\)的原根,则\(g^k\)能够生成\([1,P-1]\)中所有的数,这样的k一共有P-2个. 则\(a_i*a_j ...
- 【bzoj2219-数论之神】求解x^a==b(%n)-crt推论-原根-指标-BSGS
http://www.lydsy.com/JudgeOnline/problem.php?id=2219 弄了一个晚上加一个午休再加下午一个钟..终于ac..TAT 数论渣渣求轻虐!! 题意:求解 x ...
- fft练习
数学相关一直都好弱啊>_< 窝这个月要补一补数学啦, 先从基础的fft补起吧! 现在做了 道. 窝的fft 模板 (bzoj 2179) #include <iostream> ...
- 【学习整理】NOIP涉及的数论 [updating]
扩展欧几里得 求二元一次不定式方程 的一组解. int exgcd(int a,int b,int &x,int &y) { int t; ;y=;return a;} t=exgcd ...
- 【解高次同余方程】51nod1038 X^A Mod P
1038 X^A Mod P 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 X^A mod P = B,其中P为质数.给出P和A B,求< P的所有X. 例如:P = 11 ...
- XII Open Cup named after E.V. Pankratiev. GP of Eastern Europe (AMPPZ-2012)
A. Automat $m$超过$1600$是没用的. 从后往前考虑,设$f[i][j][k]$表示考虑$[i,n]$这些物品,一共花费$j$元钱,买了$k$个物品的最大收益. 时间复杂度$O(n^5 ...
- HAOI(十二省联考)2019 qwq记
\(\large{Day\ -1}:\) 放假了,白天大概是抱着最后一次在机房的心态复习着板子过去的.看着机房里的各位神仙丝毫不慌的颓倒是有点慌了,敲了一下多项式的板子感觉写的相当自闭,感觉AFO应该 ...
- [日常] HEOI 2019 退役记
HEOI 2019 退役记 先开坑 坐等AFO 啥时候想起来就更一点(咕咕咕) Day 0 早上打了个LCT, 打完一遍过编译一遍AC...(看来不考这玩意了) 然后进行了一些精神文明建设活动奶了一口 ...
随机推荐
- poj 3070 && nyoj 148 矩阵快速幂
poj 3070 && nyoj 148 矩阵快速幂 题目链接 poj: http://poj.org/problem?id=3070 nyoj: http://acm.nyist.n ...
- 51Nod--1049最大子段和
1049 最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 N个整数组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a ...
- CCF-201503-1-图象旋转
问题描述 试题编号: 201503-1 试题名称: 图像旋转 时间限制: 5.0s 内存限制: 256.0MB 问题描述: 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转 ...
- Keepalived实现双机热备
第一步.安装.网上很多源码安装的步骤.咱们这里以最快的方式 . [Shell] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 ...
- 超简单的php缓存类
<?php class Cache { private $dir = "data/cache/";//定义缓存目录 private $key='c_a_sss'; // 文件 ...
- javascript设计模式——组合模式
前面的话 在程序设计中,有一些和“事物是由相似的子事物构成”类似的思想.组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的.本文将详细介绍组合模式 宏命令 宏 ...
- Windows 服务多语言化时读取配置文件失败的问题。
在Installer中,按一般读取配置文件的方法(ConfigurationManager.AppSettings["CultureName"])读取不到内容. 可以这样读取: v ...
- dom4j配置文件
# 我们必须实例化 ConsoleAppender # 01.实例化对象 ConsoleAppender console =new ConsoleAppender(); # log4j.appende ...
- 关于Switch case条件语句中无break的用法
关于Switch case条件语句的另类用法 今天在拜读一位前辈的程序时,遇到了这样一段程序: /***************************/ switch(operation ...
- froms中判断数据长度自定义提示
class NumberForm(BaseForm): querynumber = forms.CharField(error_messages={'required':u'请输入手机号'}) def ...