luogu P6091 原根
LINK:原根
再复习一下原根 防止考场上要NTT求原根的时候不会求...
这道题要求求出n之内的所有原根 根据原根的定义。
原根指 若x对于模n的阶为phi(n)且\(1\leq x\leq n\) 那么称x为n的原根.
暴力做法枚举x 枚举phi(n)的因数 看其是否同余1.
复杂度nsqrt(n)左右。
考虑更快的做法 (去年省选骗分过样例也用了这个做法
考虑求出最小的原根g(暴力,但是很快. 对于剩下的原根都可以表示成g^k,条件为(k,phi(n))==1.(显然。
于是就做完了。值得一提的是我们还需要知道一个数字是否有原根。
有原根的必要充要条件:2,4,p^k,2*p^k.其中p为奇质数。
const int MAXN=1000010;
int T,top,cnt,n,maxx;
int p[MAXN],v[MAXN],phi[MAXN],vis[MAXN],s[MAXN],an[MAXN];
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<=maxx;++i)
{
if(!v[i]){p[++top]=v[i]=i;phi[i]=i-1;}
rep(1,top,j)
{
if(maxx/i<p[j])break;
int ww=i*p[j];
v[ww]=p[j];
if(v[i]==p[j]){phi[ww]=phi[i]*p[j];break;}
phi[ww]=phi[i]*(p[j]-1);
}
}
vis[2]=1;vis[4]=1;
rep(2,top,i)
{
for(ll j=1*p[i];j<=maxx;j=j*p[i])vis[j]=1;
for(ll j=2*p[i];j<=maxx;j=j*p[i])vis[j]=1;
}
}
inline int ksm(ll b,int p,int mod)
{
ll cnt=1;
while(p)
{
if(p&1)cnt=cnt*b%mod;
b=b*b%mod;p=p>>1;
}
return cnt;
}
inline void fj(int x)
{
top=0;
for(int i=1;p[i]*p[i]<=x;++i)
if(x%p[i]==0)
{
s[++top]=p[i];
while(x%p[i]==0)x/=p[i];
}
if(x>1)s[++top]=x;
}
inline int check(int x,int p)
{
if(ksm(x,phi[p],p)!=1)return 0;
rep(1,top,i)
if(ksm(x,phi[p]/s[i],p)==1)return 0;
return 1;
}
inline int getg(int p)
{
rep(1,p-1,i)if(check(i,p))return i;
return 0;
}
inline void get_ans(int g,int p)
{
cnt=0;ll ww=1;
rep(1,phi[p],i)
{
ww=ww*g%p;
if(gcd(i,phi[p])==1)an[++cnt]=ww;
}
}
int main()
{
freopen("1.in","r",stdin);
get(T);maxx=1000000;prepare();
while(T--)
{
get(n);int d;get(d);
if(vis[n])
{
fj(phi[n]);
get_ans(getg(n),n);
sort(an+1,an+1+cnt);
put(cnt);
rep(1,cnt/d,i)printf("%d ",an[i*d]);
}
else puts("0");
puts("");
}
return 0;
}
luogu P6091 原根的更多相关文章
- luogu P5605 小 A 与两位神仙 - 原根
题目传送门 传送门 Subtask 1 直接模拟. Subtask 2 BSGS算法模板. Subtask 3 考虑模 $m$ 的任意一个原根 $g$. 假设 $g^{ra} \equiv x \pm ...
- P6091-[模板]原根
正题 题目链接:https://www.luogu.com.cn/problem/P6091 题目大意 给出一个数\(p\),求出它的所有在\([0,p]\)的原根. 解题思路 原根的定义,\(\de ...
- 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho
数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...
- 51nod1135(求最小原根)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1135 题意:中文题诶- 思路:设m是正整数,a是整数,若a模 ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- [POJ1284]Primitive Roots(原根性质的应用)
题目:http://poj.org/problem?id=1284 题意:就是求一个奇素数有多少个原根 分析: 使得方程a^x=1(mod m)成立的最小正整数x是φ(m),则称a是m的一个原根 然后 ...
- 51nod 1135 原根
题目链接:51nod 1135 原根 设 m 是正整数,a是整数,若a模m的阶等于φ(m),则称 a 为 模m的一个原根.(其中φ(m)表示m的欧拉函数) 阶:gcd(a,m)=1,使得成立的最小的 ...
- hdu4992 Primitive Roots(所有原根)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4992 题意:给出n,输出n的所有原根. 思路:求出n的一个原根x,那么对于所以的i,i<phi( ...
随机推荐
- HDU 4143 A Simple Problem 题解
题目 For a given positive integer n, please find the saallest positive integer x that we can find an i ...
- 四维DP之方格取数
题目描述 传送门 设有N*N的方格图(N<=20,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): 某人从图的左上角的A(1,1) 点出发,可以向下行走,也可 ...
- day56 js收尾,jQuery前戏
目录 一.原生js事件绑定 1 开关灯案例 2 input框获取焦点,失去焦点案例 3 实现展示当前时间,定时功能 4 省市联动 二.jQuery入门 1 jQuery的两种导入方式 1.1 直接下载 ...
- gulp-less打包后calc属性计算不准确的问题
.step-item{ width: calc((100% - 50px) / 2); &:nth-child(2){ margin-right: 0; } } 这样直接写的话,编译时会直接给 ...
- Java加密与安全
数据安全 什么是数据安全?假如Bob要给Alice发送一封邮件,在发送邮件的过程中,黑客可能会窃取到邮件的内容,所以我们需要防窃听:黑客也有可能会篡改邮件的内容,所以Alice必须要有能有去识别邮 ...
- VSCode下,项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
vscode下webpack错误:无法将“webpack”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 解决方法: 1.因为 ...
- 网易实战分享|云信IM SDK接口设计实践
引语 IM (Instant Messaging)是网络上最流行的通信方式,与日常生活息息相关.IM软件也层出不穷,例如:微信.QQ.易信等.通过多年深耕和技术沉淀,云信产出了一套成熟稳定的IM SD ...
- Tips1:考虑用静态工厂方法代替构造器
用静态工厂方法来代替构造器为外界提供对象 描述: 静态工厂方法代替构造器来给外界提供对象,创建对象依然是由构造器来完成的 创建对象和提供对象: 创建对象的方式: 构造器 提供对象来哦方式: 构造器 类 ...
- Windows 磁盘分区后如何再合并&如何用Windows自带工具扩大某个分区
Windows 磁盘分区后如何再合并&用Windows自带工具扩大某个分区 注:此方法有一定的成功率,更加完善可行的方法请看http://www.diskgenius.cn/help/part ...
- 产品升级前后MD5码对比
在做产品测试的时候,经常会需要对比升级前后的MD5码,这时可以通过终端登录设备,具体步骤如下: 1.在升级前时,将MD5码写入log1.info文件: check_md5 -d / -w log1.i ...