传送门

首先要懂得 $BSGS$,$BSGS$ 可以求出关于 $Y$ 的方程 $X^Y \equiv Z (mod\ mo)$ 的最小解,其中 $gcd(X,Z)=1$

$exBSGS$ 算是 $BSGS$ 的进一步扩展,使得当 $gcd(X,Z)!=1$ 时仍然适用

先把方程转换成 $X^Y+k*mo=Z$ 的形式

因为 $Y,k$ 都是整数,所以 $Z$ 必须是 $gcd(X,mo)$ 的倍数,不然无解

所以可以把方程左右同除 $gcd(X,mo)$,变成 $X^{(Y-1)}*\frac{X}{gcd(X,mo)}+k*\frac{mo}{gcd(X,mo)}=\frac{Z}{gcd(X,mo)}$

其实这个方程就相当于 $\frac{X}{gcd(X,mo)}*X^{(Y-1)} \equiv \frac{Z}{gcd(X,mo)} (mod\ \frac{mo}{gcd(X,mo)})$

发现 $\frac{X}{gcd(X,mo)}$ 只是一个系数,如果此时 $gcd(X,\frac{mo}{gcd(X,mo)})=1$ 则可以直接套用 $BSGS$ 求解

如果此时 $gcd(X,\frac{mo}{gcd(X,mo)})!=1$ 则可以继续上述操作直到 $gcd$ 为 $1$

设第 $i$ 次操作的 $gcd$ 为 $d_i$,总共进行了 $T$ 次操作

则最后式子的形式为 $\frac{X^T}{\prod _{i=1}^{T}d_i}X^{Y-T} \equiv \frac{Z}{\prod _{i=1}^{T}d_i}\ \ (mod\ \frac{mo}{\prod _{i=1}^{T}d_i})$

要记得特判 $Y \in [0,T]$ 的情况

具体看代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
typedef long double ldb;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
int gcd(int a,int b) { return b ? gcd(b,a%b) : a; }
map <int,int> mp;
inline int ksm(int x,int y,int mo)
{
int res=;
while(y)
{
if(y&) res=1ll*res*x%mo;
x=1ll*x*x%mo; y>>=;
}
return res;
}
// X^Y=Z (mod mo)
void exBSGS(int X,int Z,int mo)
{
if(Z==) { printf("0\n"); return; }
int d=gcd(X,mo),t=,k=;
while(d!=)
{
if(Z%d) { printf("No Solution\n"); return; }
t++; k=(1ll*k*(X/d))%mo; mo/=d; Z/=d;
if(k==Z) { printf("%d\n",t); return; }
d=gcd(X,mo);
}
int m=sqrt(mo)+; mp.clear();
for(int b=,s=Z; b<m; b++,s=1ll*s*X%mo) mp[s]=b;
for(int a=,p=ksm(X,m,mo),s=1ll*k*p%mo; a<=m+; a++,s=1ll*s*p%mo)
{
if(mp.find(s)==mp.end()) continue;
printf("%d\n",a*m-mp[s]+t); return;
}
printf("No Solution\n");
}
int main()
{
int X=read(),mo=read(),Z=read();
while(X||Z||mo)
{
exBSGS(X,Z,mo);
X=read(),mo=read(),Z=read();
}
return ;
}

P4195 【模板】exBSGS/Spoj3105 Mod的更多相关文章

  1. 【模板】exBSGS/Spoj3105 Mod

    [模板]exBSGS/Spoj3105 Mod 题目描述 已知数\(a,p,b\),求满足\(a^x\equiv b \pmod p\)的最小自然数\(x\). 输入输出格式 输入格式: 每个测试文件 ...

  2. 【BZOJ1467/2480】Pku3243 clever Y/Spoj3105 Mod EXBSGS

    [BZOJ1467/2480]Pku3243 clever Y/Spoj3105 Mod Description 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. Input      ...

  3. 【bzoj2480】Spoj3105 Mod

    2480: Spoj3105 Mod Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 557  Solved: 210[Submit][Status][ ...

  4. BSGS 扩展大步小步法解决离散对数问题 (BZOJ 3239: Discrete Logging// 2480: Spoj3105 Mod)

    我先转为敬? orz% miskcoo 贴板子 BZOJ 3239: Discrete Logging//2480: Spoj3105 Mod(两道题输入不同,我这里只贴了3239的代码) CODE ...

  5. spoj3105 MOD - Power Modulo Inverted(exbsgs)

    传送门 关于exbsgs是个什么东东可以去看看yyb大佬的博客->这里 //minamoto #include<iostream> #include<cstdio> #i ...

  6. LUOGU P4195 Spoj3105 Mod

    题面 bsgs问题.因为p可能不为质数,所以我们将原先解题的式子变形 每次除以p与a的最大公约数,直到最大公约数为1或b不能整除为止 代码 #include<iostream> #incl ...

  7. BZOJ2480 Spoj3105 Mod 数论 扩展BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2480.html 题目传送门 - BZOJ2480 题意 已知数 $a,p,b$ ,求满足 $a^x≡b ...

  8. 模板BSGS(SDOI2011计算器) 模板EXBSGS

    BSGS和EXBSGS是OI中用于解决A^xΞB(mod C)的常用算法. 1.BSGS BSGS用于A,C互质的情况. 令m=sqrt(C),此时x可表示为i*m+j. 式中i和j都<=sqr ...

  9. [luogu4195 Spoj3105] Mod (大步小步)

    传送门 题目描述 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. 输入输出格式 输入格式: 每个测试文件中最多包含100组测试数据. 每组数据中,每行包含3个正整数a,p,b. 当a ...

随机推荐

  1. Linux性能优化从入门到实战:10 内存篇:如何利用Buffer和Cache优化程序的运行效率?

    缓存命中率   缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比,可以衡量缓存使用的好坏.命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好.   实际上,缓存是 ...

  2. python-验证功能的装饰器示例

    user_list=[ {'}, {'}, {'} ] current_dict={'username':None,'login':False} def auth(auth_type): def au ...

  3. thinkphp 模板

    一. 模板函数  教程https://www.kancloud.cn/manual/thinkphp5/125005 我们往往需要对模板输出变量使用函数,可以使用: {$data.name|md5} ...

  4. 前端自动化gulp使用方法

    gulp介绍 1. 网站: http://slides.com/contra/gulp#/ 2. 特点 易于使用:通过代码优于配置的策略, Gulp 让简单的任务简单,复杂的任务可管理. 构建快速 : ...

  5. 网页用html还是php

    首先,不管是html还是php,虽然这是两种不同的语言,但是都可以编写网页.不同的是,使用html编写网页是纯静态的网页,无法是运行在本地的,且无法和用户进行交互:而使用php编写的网页则是动态的,运 ...

  6. Sklearn----使用决策树预测隐形眼镜类型

    import pandas as pd import pydotplus from sklearn.externals.six import StringIO #LabelEncoder:将字符串转换 ...

  7. 【HDOJ6695】Welcome Party(multiset)

    题意: n<=1e5,x[i],y[i]<=1e18 思路: #include<bits/stdc++.h> using namespace std; typedef long ...

  8. Android多线程方案

    为主线程减轻负的多线程方案有哪些呢?这些方案分别适合在什么场景下使用? Android系统为我们提供了若干组工具类来帮助解决这个问题. AsyncTask: 为UI线程与工作线程之间进行快速的切换提供 ...

  9. postman 简单使用教程

    Postman 安装   Postman 接口测试(Collection)   Postman 接口测试(测试用例)Postman 接口测试(变量与参数化)Postman 接口测试(非 UI 运行模式 ...

  10. ubuntu18.04英文环境解决各种软件中文乱码问题

    如果要同时支持中文也支持英文,进入到该软件的字体设置界面,字体格式选择为: Noto Sans CJK SC