「SPOJ 3105」Power Modulo Inverted
「SPOJ 3105」Power Modulo Inverted
题目大意:
求关于 \(x\) 的方程
\]
的最小自然数解,不保证 \(a,p\) 互质
如果保证 \(a,p\) 互质,那么可以直接使用 \(\texttt{BSGS}\) 算法通过本题。
对于这道题目,我们考虑将式子变形
令 \(t=\gcd(a,p)\),则有
\]
得到
\]
(可以将其转换为等式,可能更好理解)
显然,当 \(b \; \mathrm{mod} \;t =0\) 时可能有解,我们只需要按照这种方式已知递归求解,直至 \(a^{'},p^{'}\) 互质即可。
另外特别需要注意的是,最小自然数解可能在迭代时就已求出,所以在迭代时需要进行特判。
每一次有效的操作至少会将 \(p\) 除以 \(2\) ,求解 \(\gcd\) 的复杂度为 \(O(log_2n)\),故这样迭代的总复杂度为 \(O(log_2^2n)\)
然后就可以求解了!
贴代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll ksm(ll a,ll b,ll p){
ll ans=1;
for(;b;b>>=1,a=1ll*a*a%p)
if(b&1) ans=1ll*ans*a%p;
return ans;
}
ll gcd(ll a,ll b){
if(!b) return a;
return gcd(b,a%b);
}
ll bsgs(ll a,ll b,ll p){
unordered_map<int,int> mp;
ll tim=0,A=1;
while(1){
ll t=gcd(a,p);if(t==1) break;
if(b%t) return -1;
b/=t,p/=t,A=1ll*A*(a/t)%p;
++tim;
if(b==A) {
return tim;
}
}
ll m=sqrt(p)+1;
ll tmp=b;
for(ll i=0;i<m;++i,tmp=1ll*tmp*a%p) mp[tmp]=i;
tmp=ksm(a,m,p);
ll now=1ll*A*tmp%p;
for(ll i=1;i<=m;++i,now=1ll*now*tmp%p){
if(mp[now]){
if(i*m-mp[now]+tim>=0) return i*m-mp[now]+tim;
}
}
return -1;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll x,y,z;
while(cin>>x>>y>>z&&(x||y||z)){
ll tmp=bsgs(x,z,y);
if(tmp==-1) cout<<"No Solution"<<'\n';
else cout<<tmp<<'\n';
}
return 0;
}
「SPOJ 3105」Power Modulo Inverted的更多相关文章
- 【SPOJ】Power Modulo Inverted(拓展BSGS)
[SPOJ]Power Modulo Inverted(拓展BSGS) 题面 洛谷 求最小的\(y\) 满足 \[k\equiv x^y(mod\ z)\] 题解 拓展\(BSGS\)模板题 #inc ...
- MOD - Power Modulo Inverted(SPOJ3105) + Clever Y(POJ3243) + Hard Equation (Gym 101853G ) + EXBSGS
思路: 前两题题面相同,代码也相同,就只贴一题的题面了.这三题的意思都是求A^X==B(mod P),P可以不是素数,EXBSGS板子题. SPOJ3105题目链接:https://www.spoj. ...
- spoj3105 MOD - Power Modulo Inverted(exbsgs)
传送门 关于exbsgs是个什么东东可以去看看yyb大佬的博客->这里 //minamoto #include<iostream> #include<cstdio> #i ...
- 「 SPOJ GSS3 」 Can you answer these queries III
# 题目大意 GSS3 - Can you answer these queries III 需要你维护一种数据结构,支持两种操作: 单点修改 求一个区间的最大子段和 # 解题思路 一个区间的最大子段 ...
- 「SPOJ TTM 」To the moon「标记永久化」
题意 概括为主席树区间加区间询问 题解 记录一下标记永久化的方法.每个点存add和sum两个标记,表示这个区间整个加多少,区间和是多少(这个区间和不包括祖先结点区间加) 然后区间加的时候,给路上每结点 ...
- LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)
写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...
- LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)
题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...
- LOJ #2540. 「PKUWC 2018」随机算法(概率dp)
题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...
- LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)
Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...
随机推荐
- 调试动态加载的js
用浏览器无法调试异步加载页面里包含的js文件.简单的说就是在调试工具里面看不到异步加载页面里包含的js文件 最近在一个新的web项目中开发功能.这个项目的管理界面有一个特点,框架是固定的,不会刷新 ...
- TaskManager任务管理工具类
TaskManager任务管理工具类 public class TaskManager { public static AbstractTask newTask(TaskContext taskIns ...
- 人工智能AI Boosting HMC Memory Chip
人工智能AI Boosting HMC Memory Chip Innosilicon的AI Boosting HMC存储芯片适用于高速,高带宽和高性能存储领域,例如AI边缘,数据中心,自动化等. H ...
- 旷视MegEngine数据加载与处理
旷视MegEngine数据加载与处理 在网络训练与测试中,数据的加载和预处理往往会耗费大量的精力. MegEngine 提供了一系列接口来规范化这些处理工作. 利用 Dataset 封装一个数据集 数 ...
- 使用Tensorize评估硬件内部特性
使用Tensorize评估硬件内部特性 这是有关如何在TVM中执行张量的入门文档. 通过使用调度原语tensorize,人们可以用相应的内部函数代替计算单元,从而轻松利用handcrafted mic ...
- 如何在GPU上优化卷积
本文将演示如何在TVM中编写高性能的卷积实现.以平方大小的输入张量和滤波器为例,并假设卷积的输入量很大.使用不同的布局来存储数据,以实现更好的数据局部性.缓冲区布局为HWCN,代表高度,宽度,通道,批 ...
- NVIDIA Jarvis:一个GPU加速对话人工智能应用的框架
NVIDIA Jarvis:一个GPU加速对话人工智能应用的框架 Introducing NVIDIA Jarvis: A Framework for GPU-Accelerated Conversa ...
- 为IHttpClientFactory添加动态命名配置
某些时候我们需要为HttpClient动态配置一些东西, 例如证书等, 参考博问 如何使用IHttpClientFactory动态添加cer证书. 例如服务是一个回调服务, 而被回调方采用了自定义的h ...
- beego搭建api服务
beego介绍 beego是一个Golang实现的开源Go应用开发框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful的框架,主要设计灵感来源于tornado.sin ...
- 20201123 实验二《Python程序设计》实验报告
20201123 2020-2021-2 <Python程序设计>实验报告课程:<Python程序设计>班级:2011姓名:晏鹏捷学号:20201123实验教师:王志强实验日期 ...