正题

题目链接:https://www.luogu.com.cn/problem/P6091


题目大意

给出一个数ppp,求出它的所有在[0,p][0,p][0,p]的原根。


解题思路

原根的定义,δp(a)\delta_p(a)δp​(a)表示一个最小的nnn使得an≡1(modp)a^n\equiv1(mod\ p)an≡1(mod p),若gcd(a,p)=1gcd(a,p)=1gcd(a,p)=1且δp(a)=φ(p)\delta_p(a)=\varphi(p)δp​(a)=φ(p)则aaa为ppp的一个原根。

两个个结论就是一个数有原根当且仅当它为2,4,pa,2pa2,4,p^a,2p^a2,4,pa,2pa(其中ppp为奇质数,a∈N+a\in N^+a∈N+)。还有若ggg表示最小正原根,那么其他原根可以被表示为gk%p(gcd(φ(p),k)=1)g^k\% p(\ gcd(\varphi(p),k)=1\ )gk%p( gcd(φ(p),k)=1 )。

这两个结论在洛谷题解都有详细证明,这里就不多赘述了。

那么考虑如何求出最小正原根,因为原根的数量大约有φ(φ(p))\varphi(\varphi (p))φ(φ(p))个,所以密集度比较高,据说最小正原根约是O(n2.5)O(n^{2.5})O(n2.5)级别的。

所以考虑直接枚举,但是我们判定的时候肯定不能从1∼φ(p)1\sim \varphi(p)1∼φ(p)枚举来判断。

我们还需要用到一个结论就是如果对于gcd(a,p)=1gcd(a,p)=1gcd(a,p)=1且ak≡1(modp)a^k\equiv 1(mod\ p)ak≡1(mod p)(也就是kkk是aaa模nnn的阶),那么有k∣φ(p)k|\varphi(p)k∣φ(p)。所以我们需要判定φ(p)\varphi(p)φ(p)的所有因子?看起来还是很大,但是我们显然有ak≡1(modp)a^k\equiv 1(mod\ p)ak≡1(mod p)那么akx≡1(modp)a^{kx}\equiv1(mod\ p)akx≡1(mod p)其中x∈N+x\in N^+x∈N+。所以我们只需要枚举φ(p)k\frac{\varphi(p)}{k}kφ(p)​(其中kkk是φ(p)\varphi(p)φ(p)的质因子)即可,因为这些数包含了其他数的倍数。

时间复杂度O(n0.25log⁡n)O(n^{0.25}\log n)O(n0.25logn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=1e6+10;
ll T,n,d,cnt,phi[N],pri[N];
bool v[N],rt[N];
vector<int> q;
void prime(){phi[1]=1;for(ll i=2;i<N;i++){if(!v[i])pri[++cnt]=i,phi[i]=i-1;for(ll j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}phi[i*pri[j]]=phi[i]*phi[pri[j]];}}rt[2]=rt[4]=1;for(ll i=2;i<=cnt;i++){for(ll j=1;j<N;j*=pri[i])rt[j]=1;for(ll j=2;j<N;j*=pri[i])rt[j]=1;}return;
}
ll power(ll x,ll b,ll p){ll ans=1;while(b){if(b&1)ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
ll gcd(ll x,ll y)
{return (!y)?x:gcd(y,x%y);}
void dec_phi(ll x){for(ll i=1;i<=cnt&&pri[i]*pri[i]<=x;i++)if(x%pri[i]==0){q.push_back(pri[i]);while(x%pri[i]==0)x/=pri[i];}if(x!=1)q.push_back(x);return;
}
bool check(ll x){if(power(x,phi[n],n)!=1)return 0;for(ll i=0;i<q.size();i++)if(power(x,phi[n]/q[i],n)==1)return 0;return 1;
}
signed main()
{scanf("%lld",&T);prime();while(T--){scanf("%lld%lld",&n,&d);q.clear();if(!rt[n]){printf("0\n\n");continue;}dec_phi(phi[n]);ll g=1;while(!check(g))g++;ll tmp=1;q.clear();for(ll i=1;i<=phi[n];i++){tmp=tmp*g%n;if(gcd(phi[n],i)==1)q.push_back(tmp);}printf("%lld\n",q.size());sort(q.begin(),q.end());for(ll i=1;i<=q.size()/d;i++)printf("%lld ",q[i*d-1]);putchar('\n');}return 0;
}

P6091-[模板]原根相关推荐

  1. x^a=b(mod c)求解x在[0,c-1]上解的个数模板+原根求法

    /*************************************求解x^a=b(mod c) x在[0,c-1]上解的个数模板输入:1e9>=a,b>=1,1e9>=c& ...

  2. P6091 【模板】原根

    题目链接 Link:P6091 前置知识 定义 aaa 模 bbb 的阶为使 an≡1(modb)a^n\equiv 1\pmod ban≡1(modb) 的最小正整数 nnn,记作 δb(a)\de ...

  3. 【学习笔记】原根 / BSGS / 扩展BSGS证明及模板

    文章目录 原根 BSGS大步小步算法 扩展BSGS 原根 如果两个整数a,ba,ba,b互质,则有aϕ(b)%b=1a^{\phi(b)}\%b=1aϕ(b)%b=1 定义模bbb意义下的aaa的阶为 ...

  4. 繁凡的ACM算法全家桶(全新的模板整合计划)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的模板整合计划 ACM算法全家桶的所有内容的 Portable Document Format 版本全部 开 源 啦 !可 ...

  5. OI模板大全(普及~省选NOI)

    整理的算法模板合集: ACM模板 hhh刚从某位大佬的洛谷首页偷到了一个好玩的东西 大佬在这儿 自己对照了一下原来我还有这么多东西没有学呜呜呜我好菜 普及- 模板大全续表续表A并查集A快速幂-取余运算 ...

  6. 原根与指标,离散对数

    原根: 定义 设m是正整数,a是整数,若a mod m 的阶等于,则称a为模m的一个原根(表示m的欧拉函数) 当且仅当指数为P - 1的时候,成立,则质数P的原根即为g 求解方法:1.将p-1进行质因 ...

  7. 离散对数和原根 欧拉定理证明

    http://www.cppblog.com/luyulaile/archive/2012/04/11/170855.aspx 欧拉定理证明 && 欧拉公式 源地址: http://w ...

  8. 「Luogu5395」【模板】第二类斯特林数·行

    「Luogu5395」[模板]第二类斯特林数·行 problem Solution 一句话题意:求\(_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\) 根据第二类斯 ...

  9. 【算法学习】B-Tree编程实现(C++模板类封装)

    B-Tree模拟编程实现.采用C++模板类封装.参考<算法导论(第二版)>第18章 B树. 实现了B树的搜索.插入和删除的重要操作. 欢迎交流和讨论,如有错误,还请指出~(E-Mali:x ...

最新文章

  1. MySQL冷备份的跨操作系统还原
  2. linux下性能监控工具
  3. linux常见的几种运行级,linux有几种运行级别
  4. YUV420数据格式
  5. Java设计模式、框架、架构、平台之间的关系
  6. Web_audio_spatialization_basics
  7. 使用 Jupyter 近 2 年,发现了这 3 个实用技巧
  8. 操作系统真相还原不明白的地方
  9. [置顶] Android玄铁剑之TextView之图文并茂
  10. 企业财务报表分析【2】
  11. 中国超级城市的新变局
  12. 七七计算机论文,七七计算机外文文献 七七计算机参考文献怎么写
  13. 规避Variable used in lambda expression should be final or effectively final而引发了方法参数值拷贝的问题
  14. contiki学习笔记(九)文件系统CFS
  15. 提取、修改、重建deb包
  16. python连续输入直到回车退出_详解Python实现按任意键继续/退出的功能
  17. 解决org.junit.runners.model.InvalidTestClassError: Invalid test class ‘xxx‘ 1. No runnable methods
  18. 让ChatGPT成为你的人工智能好友
  19. 浅谈STG游戏的开发(4月8日更新,已补全内容)
  20. 用友和中国企业一起成长

热门文章

  1. 指定的文件不是虚拟磁盘 没有快照_vmware workstaiton 15 虚拟机克隆(4)
  2. shell最大出现和连续出现次数_shell脚本分析 nginx日志访问次数最多及最耗时的页面(慢查询)...
  3. 移动计算机怎么开机密码,win7忘记开机密码解决办法
  4. android websocket封装,Android WebSocket 方案选型OkHttp
  5. 问题 C: 【例2-3】围圈报数
  6. 算法 - DFS/BFS
  7. 详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务
  8. java打印设备集中管理_Kafka+Log4j实现日志集中管理
  9. Java实现Huffman哈夫曼树
  10. 高等数学上-赵立军-北京大学出版社-题解-练习2.4