正题

题目链接: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. C#窗体中的textBox怎么设置为密码框
  2. bzoj4316: 小C的独立集
  3. 前端学习(2340):以组件方式考虑ui
  4. 抖音封禁超万账号;小米回应手机壳含毒;百度网盘封杀非官方版 | CSDN极客头条
  5. 网页内容若使用gzip压缩--获得页面源码
  6. mysql的binlog意义_带你解析MySQL binlog
  7. 中心/设置地图缩放以覆盖所有可见的标记?
  8. Linux运维基础入门(二):网络基础知识梳理02
  9. Spring实例化bean的三种方法
  10. Google I/O 还没开始,我们先来看点什么?
  11. Remoting事件序列一:客户端触发服务器端事件
  12. windows的exe文件反编译为msi安装文件
  13. 《Hadoop权威指南》知识点整理5
  14. 每日单词20110606
  15. java qq协议 php_Java基于JavaMail实现向QQ邮箱发送邮件
  16. mpl代表什么_西方经济学中MPL,APL,MPK分别是什么意思
  17. word2vec:基于层级 softmax 和负采样的 Skip-Gram
  18. tkinter-Text详解
  19. unity2D横版游戏教程9-对话框dialog
  20. Linux下的文件读写

热门文章

  1. python sqllite远程_Python实现Sqlite将字段当做索引进行查询的方法
  2. oss多线程 上传_oss-android/ios-sdk 断点续传(多线程)
  3. 硬件加速下webview切换闪屏_网页渲染性能优化 —— 性能优化下
  4. 双路服务器只显示一半内存,双路服务器只显示一半内存
  5. 上传文件白名单_十大常见web漏洞——文件上传漏洞
  6. div css标记,前端初学者必学的div加css标签
  7. linux退出lftp命令,lftp命令使用
  8. react 数字转字符_深入浅出 React -- JSX
  9. 蓝桥杯-长草-代码(BFS)
  10. 7-1 多数组排序 (12 分)三种做法(冒泡排序 ; 重写sort方法 ;利用sort和栈)