BZOJ1319Sgu261Discrete Roots——BSGS+exgcd+原根与指标+欧拉定理
题目描述
输入
输出
样例输入
样例输出
2
提示
2<=p<p<=10^9
2<=k<=100000,0<=a
首先求出$p$的原根$g$,再求出$a$的指标$b$,即$g^b\equiv a(mod\ p)$。我们知道对于$[0,p-1]$中任意数都能用原根的幂次表示,所以将$x$表示成$g^y$即$g^y\equiv x(mod\ p)$,那么原式就变成了$(g^y)^k\equiv g^b(mod\ p)->g^{yk}\equiv g^b(mod\ p)$。根据欧拉定理可知$g^{p-1}\equiv 1(mod\ p)$,所以$yk\equiv b(mod\ (p-1))$,只需要用$exgcd$求出$[0,p-1]$内所有的$y$即可。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll p,k,a;
ll g,f;
ll prime[100010];
int tot;
ll q[100010];
int cnt;
map<ll,int>b;
ll quick(ll x,ll y)
{
ll res=1ll;
while(y)
{
if(y&1)
{
res=res*x%p;
}
y>>=1;
x=x*x%p;
}
return res;
}
ll gcd(ll x,ll y)
{
return y==0?x:gcd(y,x%y);
}
void exgcd(ll A,ll B,ll &x,ll &y)
{
if(!B)
{
x=1;
y=0;
return ;
}
exgcd(B,A%B,y,x);
y-=(A/B)*x;
}
int main()
{
scanf("%lld%lld%lld",&p,&k,&a);
if(!a)
{
printf("1\n0");
return 0;
}
ll m=p-1;
for(int i=2;1ll*i*i<=m;i++)
{
if(m%i==0)
{
prime[++tot]=i;
while(m%i==0)
{
m/=i;
}
}
}
if(m!=1)
{
prime[++tot]=m;
}
for(int i=2;i<=p-1;i++)
{
bool flag=true;
for(int j=1;j<=tot;j++)
{
if(quick(i,(p-1)/prime[j])==1)
{
flag=false;
break;
}
}
if(flag)
{
g=i;
break;
}
}
int n=ceil(sqrt(p));
ll sum=1ll;
for(int i=1;i<=n;i++)
{
(sum*=g)%=p;
b[sum]=i;
}
ll num=1ll;
for(int i=0;i<=n;i++)
{
ll inv=quick(num,p-2);
if(b[inv*a%p])
{
f=i*n+b[inv*a%p];
break;
}
(num*=sum)%=p;
}
ll d=gcd(k,p-1);
if(f%d)
{
printf("0");
return 0;
}
f/=d;
ll X=k/d;
ll Y=(p-1)/d;
ll x,y;
exgcd(X,Y,x,y);
(x*=f)%=(p-1);
x%=Y;
if(x<=0)
{
x+=Y;
}
while(x<=p-1)
{
q[++cnt]=quick(g,x);
x+=Y;
}
sort(q+1,q+1+cnt);
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
{
printf("%lld\n",q[i]);
}
}
BZOJ1319Sgu261Discrete Roots——BSGS+exgcd+原根与指标+欧拉定理的更多相关文章
- BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
题目描述 在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出 ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- 求同余方程x^A=B(mod m)的解个数(原根与指标)
求方程:的解个数 分析:设,那么上述方程解的个数就与同余方程组:的解等价. 设同于方程的解分别是:,那么原方程的解的个数就是 所以现在的关键问题是求方程:的解个数. 这个方程我们需要分3类讨论: 第一 ...
- uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT)
uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT) uoj 题目描述自己看去吧( 题解时间 首先看到 $ p $ 这么小还是质数,第一时间想到 $ lucas $ 定理. 注意 ...
- 【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)
1319: Sgu261Discrete Roots Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 389 Solved: 172 Descriptio ...
- [数论]原根与指标,BSGS
刚学了这方面的知识,总结一下.推荐学习数论方面的知识还是看书学习,蒟蒻看的是<初等数论>学的. 这里也推荐几个总结性质的博客,学习大佬的代码和习题. 原根:https://blog.csd ...
- POJ 1284:Primitive Roots(素数原根的个数)
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5709 Accepted: 3261 Descr ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法
我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...
- CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)
题面 传送门 前置芝士 \(BSGS\) 什么?你不会\(BSGS\)?百度啊 原根 对于素数\(p\)和自然数\(a\),如果满足\(a^x\equiv 1\pmod{p}\)的最小的\(x\)为\ ...
随机推荐
- p33自然同态
如何理解两个划线的地方 1.因为,所以所以ker(π|_H)=kerπ∩H=N∩H 2.gN=Ng,对任意的g 属于G 因为 N被H/N 包含 也对任意的 g 属于 HN成立 ...
- pip国内镜像
[国内镜像] 中国科学技术大学 : https://pypi.mirrors.ustc.edu.cn/simple 清华:https://pypi.tuna.tsinghua.edu.cn/simpl ...
- 初用Ajax
早就有学习Ajax的想法了,但每次拿起一本Ajax的书,翻了不到百页就学不下去了,里面讲的东西实在太多了,前面讲javaScript的内容看了好 几遍都记不住,也就没心思去看后面的内容:看Ajax案例 ...
- 网站数据分析&初始来源
数据分析:如何追踪访客初始来源_搜索学院_百度搜索资源平台 https://ziyuan.baidu.com/college/articleinfo?id=260 网站数据分析:如何追踪访客初始来源 ...
- Migrate MySQL database using dump and restore
kaorimatz/mysqldump-loader: Load a MySQL dump file using LOAD DATA INFILEhttps://github.com/kaorimat ...
- asp.net mvc导出execl_转载
public FileResult ExportExcel() { var sbHtml = new StringBuilder(); sbHtml.Append("<table bo ...
- C#复习笔记(3)--C#2:解决C#1的问题(可空值类型)
可空值类型 C#2推出可空类型来表示可以为null的值类型.这是一个呼声很高的需求,因为在常用的数据库中都是允许某些值类型可为空的.那么为什么值类型就不能为空呢?内存中用一个全0的值来表示null,但 ...
- 6-2 Verbs and Adjectives with that clauses
1 Many sentences in English contain two clauses: a main clause and a "that" clause. The &q ...
- mysql中的几种日志了解
前言 MySQL中有以下日志文件,分别是: 1:重做日志(redo log) 2:回滚日志(undo log) 3:二进制日志(binlog) 4:错误日志(errorlog) 5:慢查询日志(slo ...
- C# Note33: 总结C# 6.0/7.0 新特性
先注明,本文主体参考自:C# 6.0新特性 目前代码中使用了很多C#6.0的新特性,下面以Point类来做相关叙述: public class Point { public int X { get; ...