LUOGU P4195 Spoj3105 Mod
2024-10-07 23:44:24
bsgs问题。因为p可能不为质数,所以我们将原先解题的式子变形
每次除以p与a的最大公约数,直到最大公约数为1或b不能整除为止
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#define LL long long
using namespace std;
LL a,b,m,p,now,ans;
bool flag;
map<LL,int> mp;
inline LL fast_pow(LL a,LL b){
LL ret=1;
LL aa=a;
for(;b;b>>=1){
if(b&1) ret=ret*aa%p;
aa=aa*aa%p;
}
return ret;
}
int main(){
while(~scanf("%lld%lld%lld",&a,&p,&b)){
if(a==0 && b==0 && p==0) break;
if(a%p==0){
puts("No Solution");
continue;
}
if(b==1) {
puts("0");
continue;
}
flag=false;
a%=p;b%=p;
LL t=1,cnt=0;
for(register int i=__gcd(a,p);i!=1;i=__gcd(a,p)){
if(b%i){
puts("No Solution");
flag=1;
break;
}
p/=i;t=t*a/i%p;b/=i;cnt++;
if(b==t) {printf("%lld\n",cnt);flag=1;break;}
}
if(flag) continue;
mp.clear();
now=b;
mp[now]=0;
m=ceil(sqrt(p));
for(register int i=1;i<=m;i++){
now=now*a%p;
mp[now]=i;
}
now=t;
LL k=fast_pow(a,m);
for(register int i=1;i<=m;i++){
now=now*k%p;
if(mp[now]){
flag=true;
ans=i*m-mp[now]+cnt;
printf("%lld\n",ans);
break;
}
}
if(!flag) puts("No Solution");
}
return 0;
}
最新文章
- codefordream 关于js初级训练
- iOS UITableView , UITableViewController ,UITableViewCell实现全国各省市遍历,选择相应的地区
- Unity-Animator深入系列---控制IK
- JSBinding + SharpKit / Coroutine支持
- Asp.Net Remove Unwanted Headers
- mvc action 参数绑定——值提供器【学习笔记】
- Selenium+IDEA+Maven+TestNG环境搭建
- arduino json 解析
- range的新发现
- Python数字(Number)
- c#mvc实现登录
- python 中的集合set
- iOS开发之--解决 swap file “*.swp”already exists!问题
- [HTTP]_[C/C++]_[解析URL的转义字符百分比字符串]
- 在keil调用Notepad++
- 检测Sql Server服务器SQL语句执行情况
- Ajax请求:本地跨域的问题
- centOS上安装MySQL5.7
- UIColor和 同 CIColor 与 CGColor 之间的联系、转换
- Struts2---输入验证
热门文章
- 织梦怎么调用栏目SEO标题
- ECMAScript 2016,2017 和 2018 中所有新功能的示例
- Linux后台运行java的jar包后台运行java -jar 命令
- Classpath in jar关于java加载第三方jar的集中方法和详细解释。
- PAT甲级——A1120 Friend Numbers【20】
- Jodd - Java界的瑞士军刀轻量级工具包!
- MFC注册热键
- Java开发系列-注解
- linux sudo命令失败 提示sudo:/usr/bin/sudo 必须属于用户 ID 0(的用户)并且设置 setuid 位
- Android开发 获取View的尺寸的2个方法