exBSGS板子
/*bzoj2480*/
#include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long LL;
std::map<LL,LL> mmp;
inline LL Pow(LL x,LL y,LL P){
LL ret=;
while(y){
if(y&)ret=ret*x%P;
x=x*x%P,y>>=;
}
return ret;
}
inline LL gcd(LL x,LL y){
return x==?y:gcd(y%x,x);
}
inline LL BSGS(LL A,LL B,LL C,LL D){
int len=ceil(sqrt(C+0.5));
LL temp=B,sum=D;
mmp.clear();
for(int i=;i<=len;++i)mmp[temp=temp*A%C]=i;
temp=Pow(A,len,C);
for(int i=;i<=len;++i){
sum=sum*temp%C;
if(mmp.count(sum))return i*len-mmp[sum];
}
return -;
}
inline LL exBSGS(LL A,LL B,LL C){
/*A>=0(这里涉及到0^0是否有意义(是否为1),我们假设他是1好了) B>=0 C>0(%0和/0是一个效果啊)*/
/*假设我们求的解是最小自然数(无解输出-1)*/
if(C==)return ;
A%=C,B%=C;
if(B==)return ;
/*判掉了解为0的情况*/
if(A==){
if(B==)return ;
return -;
}
/*现在A>0 B>=0 B!=1 C>1*/
LL D=;int cnt=;
for(LL g=gcd(A,C);g!=;g=gcd(A,C)){
if(B%g!=)return -;
C/=g,B/=g,D=D*(A/g)%C,++cnt;
if(D==B)return cnt;
}
/*得到的C一定不为1*/
A%=C;
/*现在我们得到了A的cnt次方与C除去gcd后的结果(分别是D和C),并且现在A与C互质了*/
LL ret=BSGS(A,B,C,D);
return ret==-?-:ret+cnt;
}
int main(){
LL a,p,b,ans;
while(true){
scanf("%lld%lld%lld",&a,&p,&b);
if(p==)return ;
ans=exBSGS(a,b,p);
if(ans==-)puts("No Solution");
else printf("%lld\n",ans);
}
}
exBSGS板子的更多相关文章
- MOD - Power Modulo Inverted(SPOJ3105) + Clever Y(POJ3243) + Hard Equation (Gym 101853G ) + EXBSGS
思路: 前两题题面相同,代码也相同,就只贴一题的题面了.这三题的意思都是求A^X==B(mod P),P可以不是素数,EXBSGS板子题. SPOJ3105题目链接:https://www.spoj. ...
- 省选算法学习-BSGS与exBSGS与二次剩余
前置知识 扩展欧几里得,快速幂 都是很基础的东西 扩展欧几里得 说实话这个东西我学了好几遍都没有懂,最近终于搞明白,可以考场现推了,故放到这里来加深印象 翡蜀定理 方程$ax+by=gcd(a,b)$ ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- [板子]ISAP
ISAP求最大流,敲了一发板子,无压行,教程略去.转载请随意. #include <cstdio> #include <cstring> #include <algori ...
- [板子]倍增LCA
倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...
- UP Board 人若有大胆,板子就很惨:首次上电开机失败
前言 原创文章,转载引用务必注明链接. 注意:拍照自带抖动功能,画质大家凑合着看.冬日天气干燥,手触摸板子前建议流水洗手或者握持大体积导电体将静电放走. 本文使用Markdown写成,为获得更好的阅读 ...
- orpsocv2 从ROM(bootrom)启动分析--以atlys板子的启动为例子
1 复位后的启动地址 1) 复位后,启动地址在or1200_defines.v最后宏定义,atlys板子的目录:orpsocv2\boards\xilinx\atlys\rtl\verilog\inc ...
- Lattice FPGA 板子 调试笔记
最近在调试LATTICE FPGA 做的视频板子,颇不顺利,所以记录下来作为以后的参考: 1.FPGA的IO口不是所有的都是双向的,有些有特殊作用的是单向的. 在查阅 LatticeECP3-17E ...
- 【图像处理】【SEED-VPM】1.板子基本操作流程
>>>>>>>>>>>>>>>>>>>>>>>>> ...
随机推荐
- Qt-QML-全新导航布局
哈哈,写了一个全新的导航布局,具体内容还没有完成,现在先把整个布局的屏幕划分分享出来 先看效果图 身下也没有好说的,看代码 /* 作者:张建伟 时间:2018年4月3日 简述:该文件为下显主窗口布局文 ...
- Qt-QML-Loader初步接触
先说说为什么用到了QML的Loader,这里我就要先扯点别的,那就是QML自带的ColorDialog,QML的机制 是优先调用系统提供的ColorDialog,如果系统的ColorDialog的不可 ...
- 接口测试工具postman(七)下载文件接口
按照一般请求接口,配置好接口地址以及参数,点击Send and Download 按钮,执行请求的同时会下载文件
- STL之--插入迭代器(back_inserter,inserter,front_inserter的区别)
除了普通迭代器,C++标准模板库还定义了几种特殊的迭代器,分别是插入迭代器.流迭代器.反向迭代器和移动迭代器,定义在<iterator>头文件中,下面主要介绍三种插入迭代器(back_in ...
- Python3 Tkinter-Scrollbar
1.创建 from tkinter import * root=Tk() Scrollbar(root).pack() root.mainloop() 2.设置silder的位置 from tkint ...
- JavaScript中childNodes和children的区别
我在学习JavaScript对DOM操作的过程中,发现了使用childNodes属性,得不到我想要的结果,因此我就从JavaScript高级程序设计中了解了childNodes和children的区别 ...
- Rescue(BFS时间最短 另开数组或优先队列)
Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M ...
- Log Files
Description Nikolay has decided to become the best programmer in the world! Now he regularly takes p ...
- 课堂练习之找数字0-N中“1”出现的次数
一.题目与要求 题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求:1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12) ...
- opencart
1. Deleting english language, what happens? Disable English tab , category and products 1) Fir ...