1319: Sgu261Discrete Roots

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 389  Solved: 172

Description

给出三个整数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 8

Sample Output

1
2

HINT

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)的更多相关文章

  1. Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

    Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...

  2. 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]. ...

  3. bzoj 1420 Discrete Root - 原根 - exgcd - BSGS

    题目传送门 戳我来传送 题目大意 给定$k, p, a$,求$x^{k}\equiv a \pmod{p}$在模$p$意义下的所有根. 考虑模$p$下的某个原根$g$. 那么$x  = g^{ind_ ...

  4. BZOJ1319Sgu261Discrete Roots——BSGS+exgcd+原根与指标+欧拉定理

    题目描述 给出三个整数p,k,a,其中p为质数,求出所有满足x^k=a (mod p),0<=x<=p-1的x. 输入 三个整数p,k,a. 输出 第一行一个整数,表示符合条件的x的个数. ...

  5. Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法

    我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...

  6. CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)

    题面 传送门 前置芝士 \(BSGS\) 什么?你不会\(BSGS\)?百度啊 原根 对于素数\(p\)和自然数\(a\),如果满足\(a^x\equiv 1\pmod{p}\)的最小的\(x\)为\ ...

  7. 51Nod1123 X^A Mod B 数论 中国剩余定理 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1123.html 题目传送门 - 51Nod1123 题意 $T$ 组数据. 给定 $A,B,C$,求 ...

  8. 51Nod1039 N^3 Mod P 数论 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1039.html 题目传送门 - 51Nod1039 题意 题解 这题我用求高次剩余的做法,要卡常数. ...

  9. 51Nod1038 X^A Mod P 数论 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1038.html 题目传送门 - 51Nod1038 题意 题解 在模质数意义下,求高次剩余,模板题. ...

随机推荐

  1. 20160314 Request 和Response

    一.Response 1.Resonse的继承结构: ServletResponse--HttpServletResponse 2.Response代表响应,于是响应消息中的 状态码.响应头.实体内容 ...

  2. Android开发之Adapter

    学习android时,对于我这种初学者来说,刚开始接触控件,发现有的控件需要adapter有些不需要,对此我感到不解.所以决定一探究竟. 其实android是一个完全遵从MVC模式的框架,activi ...

  3. JAVA spring 常用包作用

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. 仿主题广告轮播js

    function SlideShow(c) { var a = document.getElementById("slide"); var f = document.getElem ...

  5. 常用的WebService调用接口

    天气预报Web服务,数据来源于中国气象局Endpoint :http://www.webxml.com.cn/WebServices/WeatherWebService.asmxDisco      ...

  6. AppDelegate 方法详解

    iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有 ...

  7. 注释玩转webapi

    using System; using System.Collections.Generic; using System.Net.Http.Formatting; using System.Web.H ...

  8. SGU 280.Trade centers(贪心)

    SGU 280.Trade centers 解题报告 题意: n(<=30000)个城市,(n-1)条道路,求最少需要选择多少个城市建造市场,使得所有城市到任意一个市场的距离不大于k. Solu ...

  9. python 自动化之路 day 面向对象基础

    1.面向對象基础概述 面向过程: 根据业务逻辑从上到下垒代码(如果程序修改,对于依赖的过程都需要进行修改.) 函数式: 将某功能代码封装到函数中,如后便无需重复编写,仅需要调用函数即可 面向对象: 世 ...

  10. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(一)

    项目组用air来开发手游, 但有些在原生应用里很容易实现的功能没有办法在air中直接调用,比如说震动,服务等等.但Adobe 提供了一种方法让air间接调用本地代码(java,object-c...) ...