【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS
题目描述
输入
输入包含多组数据。
输出
样例输入
【样例输入1】
3 1
2 1 3
2 2 3
2 3 3
【样例输入2】
3 2
2 1 3
2 2 3
2 3 3
样例输出
【样例输出1】
2
1
2
【样例输出2】
2
1
0
题解
EXgcd+BSGS
第一问直接快速幂。
第二问需要将xy≡z(mod p)转化为xy+tp=z,进而用EXgcd求解。
第三问是裸的BSGS。
根据费马小定理可知如果有解,答案一定小于p。
设m=√p(向上取整),再设x=km+b,其中k<m,b<m。
那么就有y^(km+b)≡z(mod p),即y^b≡z/y^km(mod p)。
于是我们可以将所有的y^b mod p加入到map中,然后枚举k,求出z/y^km,看是否有相同的值在map中即可。
本题特判比较多,具体详见代码。
#include <cstdio>
#include <cmath>
#include <map>
using namespace std;
typedef long long ll;
map<ll , ll> f;
map<ll , ll>::iterator it;
ll pow(ll x , ll y , ll mod)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
ll gcd(ll a , ll b)
{
return b ? gcd(b , a % b) : a;
}
void exgcd(ll a , ll b , ll &x , ll &y)
{
if(!b)
{
x = 1 , y = 0;
return;
}
exgcd(b , a % b , x , y);
ll t = x;
x = y , y = t - a / b * y;
}
int main()
{
int T , k;
scanf("%d%d" , &T , &k);
while(T -- )
{
ll y , z , p;
scanf("%lld%lld%lld" , &y , &z , &p);
switch(k)
{
case 1: printf("%lld\n" , pow(y , z , p)); break;
case 2:
{
y %= p , z %= p;
ll t = gcd(y , p) , x1 , x2;
if(z % t != 0)
{
printf("Orz, I cannot find x!\n");
break;
}
y /= t , p /= t , z /= t , exgcd(y , p , x1 , x2) , x1 *= z;
while(x1 < 0) x1 += p;
while(x1 - p >= 0) x1 -= p;
printf("%lld\n" , x1);
break;
}
default:
{
y %= p , z %= p;
if(!y)
{
if(!z) printf("1\n");
else printf("Orz, I cannot find x!\n");
break;
}
ll m = (ll)ceil(sqrt(p)) , i , flag = 0 , t = 1 , temp;
f.clear();
for(i = 0 ; i < m ; i ++ )
{
if(f.find(t) == f.end()) f[t] = i;
t = t * y % p;
}
temp = pow(y , p - m - 1 , p) , t = 1;
for(i = 0 ; i <= m ; i ++ )
{
it = f.find(z * t % p) , t = t * temp % p;
if(it != f.end())
{
printf("%lld\n" , i * m + it->second) , flag = 1;
break;
}
}
if(!flag) printf("Orz, I cannot find x!\n");
}
}
}
return 0;
}
【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS的更多相关文章
- BZOJ2242[SDOI2011]计算器——exgcd+BSGS
题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...
- BZOJ2242 [SDOI2011]计算器 【BSGS】
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 4741 Solved: 1796 [Submit][Sta ...
- 【BZOJ2242】计算器(BSGS,快速幂)
[BZOJ2242]计算器(BSGS,快速幂) 题面 BZOJ 洛谷 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给 ...
- [bzoj2242][Sdoi2011]计算器_exgcd_BSGS
计算器 bzoj-2242 Sdoi-2011 题目大意:裸题,支持快速幂.扩展gcd.拔山盖世 注释:所有数据保证int,10组数据. 想法:裸题,就是注意一下exgcd别敲错... ... 最后, ...
- BZOJ2242 [SDOI2011]计算器
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- bzoj2242: [SDOI2011]计算器 BSGS+exgcd
你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值:(快速幂) 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数:(exgcd) 3.给 ...
- 【数学 BSGS】bzoj2242: [SDOI2011]计算器
数论的板子集合…… Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最 ...
- bzoj2242: [SDOI2011]计算器 && BSGS 算法
BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...
- 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器
说是BSGS……但是跟前面那题的扩展BSGS其实是一样的……因为模数虽然是质数,但是其可能可以整除a!!所以这两者其实是一样的…… 第一二种操作不赘述. #include<cstdio> ...
随机推荐
- VERITAS NETBACKUP运维手册(自制)
ps:本文为目录.详情请点如下目录超链接 1 VERITAS NETBACKUP介绍 1.1 NBU基本概念 1.2 配置存储单元 1.3 配置备份策略(Policy) 1.4 配置NetBackup ...
- Flutter Json序列号和反序列化遇到问题 Missing "part 'xxx.g.dart';"
/** * * 1.@JsonSerializable() 这是表示告诉编译器这个类是需要生成Model类的 * 2,@JsonKey 由于服务器返回的部分数据名称在Dart语言中是不被允许的, * ...
- jrtplib移植
jrtplib版本:3.11.1 jthread版本:1.3.3 libsrtp版本:1.6.0 jrtplib库有两种编译方式: 1. 使能jthread编译,此方式可使jrtplib自动在后台轮询 ...
- springboot中加入druid对sql进行监控
springboot作为现在十分流行的框架,简化Spring应用的初始搭建以及开发过程,现在我们就使用springboot来进行简单的web项目搭建并对项目sql进行监控. 项目的搭建就省略了,spr ...
- k8s的ingress资源简述
ingress controller是独立与controller-manager的Ingress的主要作用是可以利用nginx,haproxy,envoy,traefik等负载均衡器来暴露集群内部服务 ...
- https://www.atlassian.com
https://www.atlassian.com 解决:confluence 5.9.4 一次性恢复30个插件 - 简书 https://www.jianshu.com/p/c32d8aa739b8 ...
- 25.VUE学习之-单击和双击事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 嵌入式Linux环境搭建备忘
嵌入式Linux开发平台搭建步骤: 1.安装宿主机Linux系统 如果选用最新的Linux发行版,应改主意其他软件是否能很好的兼容. 2.安装交叉编译器 交叉编译器的版本很多,一般到芯片厂家官网下载官 ...
- spring-data-mongodb
[引入maven依赖] <!-- mongodb spring --> <dependency> <groupId>org.springframework. ...
- [BZOJ3625][CF438E]小朋友和二叉树
题面 Description 我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树. 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\ldots,c_n\).如果一棵带点权的有根二叉树满足其 ...