求:$a^{bx \%p}\equiv 1(\mod p)$ 的一个可行的 $x$.

根据欧拉定理,我们知道 $a^{\phi(p)}\equiv 1(\mod p)$

而在 $a^x\equiv 1(\mod p)$ 这个式子中 $x$ 是存在很多个解的.

这些解之间存在着循环节,使得任意解 $x$ 可以被表示成循环节的倍数.

我们设这个循环节为 $cir$.

由于已知 $\phi(p)$ 一定是一个可行解,所以最小循环节一定是 $\phi(p)$ 的约数.

然后我们就可以对 $\phi(p)$ 进行质因数分解来求这个最小循环节 $cir$.

求出来 $cir$ 后,可得 $bx\%p=cir\times y$

你发现因为有这个 $\%p$ 操作,所以会导致这个方程解不出来.

但是好在我们发现,左面那个式子可以变为 $bx+pk=l$,而这个 $l$ 可以被表示为 $i\times gcd(b,p)$

故我们可以将式子变为 $i\times gcd(b,p)=y\times cir$.

然后我们可以对这个求最小通解(因为如果最小解小于 $p$,则一定可以被 $bx\%p$ 表示出来,而且满足 $x\leqslant p-1$ )

这个最小通解是 $c=\frac{cir\times gcd(b,p)}{gcd(gcd(b,p),cir)}$

然后用 exgcd 求一下 $bx+pk=c$ 的 $x$ 的最小正整数解就可以了.

这里可以证明一下为什么只要存在 $bx+pk=c$ 就能保证 $x<p$:

我们可以将 $x$ 表示成 $p+d$ 的形式,那么原式为 $b(p+d)+pk=c$

$\Rightarrow bp+bd+pk=c$

$\Rightarrow b\times d+p\times (k+d)=c$

所以,一旦 $x>p$,我们就可以将一些部分导到 $p\times k$ 那里,以此来实现 $x<p$

#include <string>
#include <ctime>
#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
#define N 10000060
#define ll long long
using namespace std;
void setIO(string s) {
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
}
int H=0;
int fr[N];
int prime[N],vis[N],phi[N];
int answer[N];
int MN[N];
struct data {
int a,b,p,id;
data(int a=0,int b=0,int p=0,int id=0):a(a),b(b),p(p),id(id){}
};
vector<data>G[N];
inline int qpow(int x,int y,int mod) {
int tmp=1;
while(y) {
if(y&1) {
tmp=(ll)tmp*x%mod;
}
x=(ll)x*x%mod;
y>>=1;
}
return tmp;
}
int exgcd(int a,int b,int &x,int &y) {
if(!b) {
x=1,y=0;
return a;
}
int gcd=exgcd(b,a%b,x,y);
int tmp=x;
x=y,y=tmp-(a/b)*y;
return gcd;
}
void Linear_shaker() {
int i,j,cnt=0;
fr[1]=1;
for(i=2;i<N;++i) {
if(!vis[i]) {
prime[++cnt]=i;
phi[i]=i-1;
fr[i]=1;
}
for(j=1;j<=cnt&&prime[j]*i<N;++j) {
vis[i*prime[j]]=1;
if(i%prime[j]) {
phi[i*prime[j]]=phi[i]*(prime[j]-1);
fr[i*prime[j]]=i;
}
else {
fr[i*prime[j]]=i;
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
}
int main() {
// setIO("mod");
Linear_shaker();
int i=0,j=0,t1,t2,tp=0;
int a,b,p,Mx=0,k;
while(scanf("%d",&a)!=EOF) {
scanf("%d%d",&b,&p);
++i;
++tp;
if(__gcd(a,p)!=1) {
answer[i]=-1;
}
else {
Mx=max(Mx,phi[p]);
G[phi[p]].push_back(data(a,b,p,i));
MN[i]=phi[p];
int w=phi[p],tmp,c=1;
while(w!=1) {
while(w!=1&&qpow(a,fr[w]*c,p)==1) {
w=fr[w];
}
tmp=w/fr[w];
while(w%tmp==0&&w!=1) {
c*=tmp;
w/=tmp;
}
}
MN[i]=c;
}
}
for(i=1;i<=Mx;++i) {
for(j=0;j<G[i].size();++j) {
a=G[i][j].a;
b=G[i][j].b;
p=G[i][j].p;
int x=0,y=0;
int id=G[i][j].id;
int delta=MN[id];
int gcd=__gcd(p,b);
int tmp=(1ll*gcd*delta)/(__gcd(gcd,delta));
if(tmp>=p) {
answer[id]=-1;
}
else {
gcd=exgcd(b,p,x,y);
x=(1ll*x*(tmp/gcd)%(p/gcd)+(p/gcd))%(p/gcd);
answer[id]=x;
}
}
}
for(i=1;i<=tp;++i) printf("%d\n",answer[i]);
return 0;
}

  

模拟赛 T1 费马小定理+质因数分解+exgcd的更多相关文章

  1. hdu6440 Dream 2018CCPC网络赛C 费马小定理+构造

    题目传送门 题目大意: 给定一个素数p,让你重载加法运算和乘法运算,使(m+n)p=mp+np,并且 存在一个小于p的q,使集合{qk|0<k<p,k∈Z} 等于集合{k|0<k&l ...

  2. 【2018 ICPC焦作网络赛 G】Give Candies(费马小定理+快速幂取模)

    There are N children in kindergarten. Miss Li bought them N candies. To make the process more intere ...

  3. 【2018 CCPC网络赛】1003 - 费马小定理

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6440 这题主要是理解题意: 题意:定义一个加法和乘法,使得 (m+n)p = mp+np; 其中给定 ...

  4. HDU6440 Dream 2018CCPC网络赛-费马小定理

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门  原题目描述在最下面.  给定一个素数p ...

  5. HDU6440 Dream(费马小定理+构造) -2018CCPC网络赛1003

    题意: 给定素数p,定义p内封闭的加法和乘法,使得$(m+n)^p=m^p+n^p$ 思路: 由费马小定理,p是素数,$a^{p-1}\equiv 1(mod\;p)$ 所以$(m+n)^{p}\eq ...

  6. 数论初步(费马小定理) - Happy 2004

    Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2 ...

  7. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理

    Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...

  8. HDU 1098 Ignatius's puzzle 费马小定理+扩展欧几里德算法

    题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为 ...

  9. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

随机推荐

  1. 微信企业号JS SDK

    微信企业号JS SDK <?php define('CorpID', "wx82e2c31215d9a5a7"); define('CorpSecret', "&q ...

  2. nodejs的child_process

    child_process  模块提供了衍生子进程的能力 异步方式:spawn.exec.execFile.fork 同步方式:spawnSync.execSync.execFileSync 说明: ...

  3. c# 自动给版本升级,遇9变0且前面一个版本加1

    /// <summary> /// 版本辅助类 /// 创建人: /// 创建时间:2019-11-18 13:53:55 /// </summary> public clas ...

  4. xss之挑战小靶场(1-10)

    在线靶场(http://xss.fbisb.com) w 第一关 get请求,没有什么过滤,直接上<script>alert()</script> 源码: 第二关 输入参数会显 ...

  5. Python '\r', '\n', '\r\n' 的彻底理解

    回车和换行的历史: 机械打字机有回车和换行两个键作用分别是: 换行就是把滚筒卷一格,不改变水平位置.   (即移到下一行,但不是行首,而是和上一行水平位置一样) 回车就是把水平位置复位,不卷动滚筒.  ...

  6. 使用kibana给不同的用户创建不同的space

    Elastic安全机制 在很多的情况下,出于安全的原因,我们需要对不同的Kibana用户分配不同的用户权限,这样使得他们之间不能互相访问彼此的资源,同 时他们也应该对不同的索引拥有不同的权限,比如读, ...

  7. 需要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。

    问题: 该错误是因为应用程序需要jQuery,但是当前项目中并没有jQuery,或者存在jQuery但是程序不知道jQuery的存放路径. 解决方案: 一.下载jQuery,引入必要的jquery-X ...

  8. nginx fastcgi模块ngx_http_fastcgi_module详细解析、使用手册、完整翻译

    ngx_http_fastcgi_module 模块允许将请求传递给 FastCGI 服务器. 示例配置 location / { fastcgi_pass localhost:9000; fastc ...

  9. android studio学习----添加项目依赖包补充---添加github上的开源项目为库

    导入maven中的库 如果开源库作者有将代码放到Maven库中,我们可以在gradle配置中直接引入,类似如下: compile 'com.github.dmytrodanylyk.android-p ...

  10. FPM九:配置FPM Launchpad

    1.事物代码LPD_CUST,点击新建输入角色和实例保存. 2.新建文件夹: 3.新建应用程序 这样一个菜单的LAUNCHPAD就好了. 4.FPM_WB运行FPM工作台,新建OVP应用程序. 保存本 ...