1319: Sgu261Discrete Roots
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 389 Solved: 172Description
给出三个整数p,k,a,其中p为质数,求出所有满足x^k=a (mod p),0<=x<=p-1的x。Input
三个整数p,k,a。Output
第一行一个整数,表示符合条件的x的个数。 第二行开始每行一个数,表示符合条件的x,按从小到大的顺序输出。Sample Input
11 3 8Sample Output
1
2HINT
2<=p<p<=10^9
2<=k<=100000,0<=a
【分析】
终于发现原根的用处了!原根的幂构成模p的缩系,即用原根的幂可以表示所有模p下的数。假设模p下的一个原根是g,对于方程x^k=a(%prim) 可以写成(g^i)^k三g^j(%p),那么有g^j=三a(mod p),j可以用BSGS求得,那么i*k三j(%phi[p]),这个可以用exgcd求出所有可行的i,答案为g^i。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define LL long long
#define Maxn 1000010 LL ax,ay;
LL exgcd(LL a,LL b)
{
if(b==) {ax=;ay=;return a;}
LL g=exgcd(b,a%b);
LL xx=ax;
ax=ay;ay=xx-(a/b)*ay;
return g;
} LL np[Maxn];
void div(LL x)
{
np[]=;
for(LL i=;i*i<=x;i++) if(x%i==)
{
np[++np[]]=i;
while(x%i==) x/=i;
}
if(x>) np[++np[]]=x;
} LL qpow(LL x,LL b,LL p)
{
LL xx=x,pp=p,ans=;
while(b)
{
if(b&) ans=(ans*xx)%p;
xx=(xx*xx)%p;
b>>=;
}
return (LL)ans;
} LL ffind(LL p)
{
div(p-);
for(LL i=;i<p;i++)
{
bool ok=;
for(LL j=;j<=np[];j++)
{
if(qpow(i,(p-)/np[j],p)==) {ok=;break;}
}
if(ok) return i;
}
return -;
} LL cnt;
struct node
{
LL id,val;
}t[Maxn]; bool cmp(node x,node y) {return (x.val==y.val)?(x.id<y.id):(x.val<y.val);} LL t_div(LL x)
{
LL l=,r=cnt;
while(l<r)
{
LL mid=(l+r)>>;
if(t[mid].val==x) return t[mid].id;
if(t[mid].val>x) r=mid-;
else l=mid+;
}
if(t[l].val==x) return t[l].id;
return -;
} LL BSGS(LL x,LL c,LL p)
{
t[].id=;t[].val=;
LL sq=(LL)ceil(sqrt((double)p));
for(LL i=;i<=sq;i++) t[i].id=i,t[i].val=(t[i-].val*x)%p;
sort(t,t++sq,cmp);
cnt=;
for(LL i=;i<=sq;i++) if(t[i].val!=t[i-].val) t[++cnt]=t[i]; LL bm=qpow(x,sq,p);
bm=qpow(bm,p-,p);
LL tmp=c;
for(LL i=;i<=sq;i++)
{
LL now=t_div(tmp);
if(now!=-) return i*sq+now;
tmp=(tmp*bm)%p;
}
return -;
} LL op[Maxn]; int main()
{
LL p,k,a;
scanf("%lld%lld%lld",&p,&k,&a);
LL g=ffind(p);
LL C=BSGS(g,a,p);
if(C==-) {printf("0\n");return ;}
C%=p-;
LL d=exgcd(k,p-);
if(C%d!=) {printf("0\n");return ;}
ax*=C/d;
ax=(ax%((p-)/d)+((p-)/d))%((p-)/d); LL ans=qpow(g,ax,p),id=ax,mx=ans,add=qpow(g,(p-)/d,p);
op[]=;
op[++op[]]=ans;
LL fs=ans;
while(add!=)
{
id=ax+((p-)/d);
ans=(ans*add)%p;
if(ans==fs) break;
op[++op[]]=ans;
}
sort(op+,op++op[]);
printf("%lld\n",op[]);
for(LL i=;i<=op[];i++) printf("%lld\n",op[i]);
return ;
}
[BZOJ 1319]
2016-09-07 13:52:58
【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)的更多相关文章
-
Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)
Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...
-
BZOJ 1420: Discrete Root (原根+BSGS)
题意 已知kkk, aaa, ppp. 求 xk≡a (mod p)x^k\equiv a\ (mod\ p)xk≡a (mod p) 的所有根. 根的范围[0,p−1][0,p-1][0,p−1]. ...
-
bzoj 1420 Discrete Root - 原根 - exgcd - BSGS
题目传送门 戳我来传送 题目大意 给定$k, p, a$,求$x^{k}\equiv a \pmod{p}$在模$p$意义下的所有根. 考虑模$p$下的某个原根$g$. 那么$x = g^{ind_ ...
-
BZOJ1319Sgu261Discrete Roots——BSGS+exgcd+原根与指标+欧拉定理
题目描述 给出三个整数p,k,a,其中p为质数,求出所有满足x^k=a (mod p),0<=x<=p-1的x. 输入 三个整数p,k,a. 输出 第一行一个整数,表示符合条件的x的个数. ...
-
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\)为\ ...
-
51Nod1123 X^A Mod B 数论 中国剩余定理 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1123.html 题目传送门 - 51Nod1123 题意 $T$ 组数据. 给定 $A,B,C$,求 ...
-
51Nod1039 N^3 Mod P 数论 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1039.html 题目传送门 - 51Nod1039 题意 题解 这题我用求高次剩余的做法,要卡常数. ...
-
51Nod1038 X^A Mod P 数论 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1038.html 题目传送门 - 51Nod1038 题意 题解 在模质数意义下,求高次剩余,模板题. ...
随机推荐
-
[转]Oracle数据库ASH和AWR的简单介绍
在Oracle数据库中,有时我们可能会遇到这样的术语:ASH和AWR,那么它们是怎样产生的呢?它们的作用又是什么呢?本文我们就来介绍这一部分内容. 1.10g之前 用户的连接将产生会话,当 ...
-
VS2015 Android
最近安装了VS2015,体验了一下android 的开发,按模板创建运行了个,试下效果很不错.也可以可视化设计.但昨天再次打开或创建一个android程序后,设计界面直接不能显示,显示错误:(可能是升 ...
-
android 系统相册调用,各版本的区别总结
请求系统相册有三个Action: (注意以下 图库(缩略图) 和 图片(原图) 的区别) ACTION_OPEN_DOCUMENT 仅限4.4或以上使用 默认打开原图 ACTION_ ...
-
【转】linux-系统启动流程详解
第二十章.启动流程.模块管理与 Loader 最近升级日期:2009/09/14 1. Linux 的启动流程分析 1.1 启动流程一览 1.2 BIOS, boot loader 与 kernel ...
-
20145305 《Java程序设计》实验一
实验名称 实现凯撒密码,并进行测试. 实验内容 它是一种代换密码.据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码. 凯撒密码作为一种最为古老的对称加密*,在古罗马的时候都已经 ...
-
教程-Delphi第三方控件安装卸载指南
1 只有一个DCU文件的组件.DCU文件是编译好的单元文件,这样的组件是作者不想把源码公布.一般来说,作者必须说明此组件适合Delphi的哪种版本,如果版本不对,在安装时就会出现错误.也正是因为没有源 ...
-
动态规划---最长公共子序列 hdu1159
hdu1159 题目要求两个字符串最长公共子序列, 状态转换方程 f[i][j]=f[i-1][j-1]+1; a[i]=b[j]时 f[i][j]=MAX{f[i-1][j],f[i][j-1] ...
-
【Git】Git教程
http://www.liaoxuefeng.com/
-
简说Java线程的那几个启动方式
本文首发于本博客 猫叔的博客,转载请申明出处 前言 并发是一件很美妙的事情,线程的调度与使用会让你除了业务代码外,有新的世界观,无论你是否参与但是这对于你未来的成长帮助很大. 所以,让我们来好好看看在 ...
-
python操作redis命令
Python操作redis from redis import StrictRedis, ConnectionPoolredis_url="redis://:xxxx@112.27.10.1 ...