题目:https://www.acwing.com/problem/content/226/

题意:有一个计算器能完成三种功能

1、给定Y,Z,P,计算YZModPYZModP 的值;

2、给定Y,Z,P,计算满足xY≡Z(modP)xY≡Z(modP)的最小非负整数;

3、给定Y,Z,P,计算满足Yx≡Z(modP)Yx≡Z(modP)的最小非负整数。

思路:第一种很明显就是个快速幂取模,第二种,因为p是个质数,所以我们可以用快速幂取逆元来计算,第三种就是BSGS的板子

#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define ll long long
//快速幂求a^b
LL power(LL a,LL b,LL n)
{
LL s=;
while(b)
{
if(b&)
s=(s*a)%n;
a=(a*a)%n;
b=b>>;
}
return s;
}
ll work2(ll y,ll z,ll p)//xy=z mod p
{
if(y%p==&&z!=) return -;
return z*power(y,p-,p)%p;
}
ll bsgs(ll a,ll b,ll p){
map<ll,ll> hash;
hash.clear();
b%=p;
ll t=(ll)sqrt(p)+;
for(int j=;j<t;j++){
ll val = (ll)b*power(a,j,p)%p;
hash[val]=j;
}
a=power(a,t,p);
if(a==) return b==?:-;
for(int i=;i<=t;i++){
ll val = power(a,i,p);
ll j=hash.find(val)==hash.end()?-:hash[val];
if(j>=&&i*t-j>=) return i*t-j;
}
return -;
}
int main()
{
LL a,b,t,n;
ll op;
scanf("%lld%lld",&t,&op);
for(int i=;i<t;i++){
scanf("%lld%lld%lld",&a,&b,&n);
if(op==){
printf("%lld\n",power(a,b,n));
}
else if(op==){
ll w=work2(a,b,n);
if(w==-) printf("Orz, I cannot find x!\n");
else printf("%lld\n",w);
}
else if(op==){
ll w=bsgs(a,b,n);
if(w==-) printf("Orz, I cannot find x!\n");
else printf("%lld\n",w);
}
}
return ;
}

AcWing 224. 计算器 (BSGS算法)打卡的更多相关文章

  1. bzoj2242: [SDOI2011]计算器 && BSGS 算法

    BSGS算法 给定y.z.p,计算满足yx mod p=z的最小非负整数x.p为质数(没法写数学公式,以下内容用心去感受吧) 设 x = i*m + j. 则 y^(j)≡z∗y^(-i*m)) (m ...

  2. bzoj 2242: [SDOI2011]计算器 & BSGS算法笔记

    这题的主要难点在于第三问该如何解决 于是就要知道BSGS是怎样的一种方法了 首先BSGS是meet in the middle的一种(戳下面看) http://m.blog.csdn.net/blog ...

  3. luogu2485 [SDOI2011]计算器 poj3243 Clever Y BSGS算法

    BSGS 算法,即 Baby Step,Giant Step 算法.拔山盖世算法. 计算 \(a^x \equiv b \pmod p\). \(p\)为质数时 特判掉 \(a,p\) 不互质的情况. ...

  4. 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法

    BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...

  5. BSGS算法

    BSGS算法 我是看着\(ppl\)的博客学的,您可以先访问\(ppl\)的博客 Part1 BSGS算法 求解关于\(x\)的方程 \[y^x=z(mod\ p)\] 其中\((y,p)=1\) 做 ...

  6. BSGS算法及扩展

    BSGS算法 \(Baby Step Giant Step\)算法,即大步小步算法,缩写为\(BSGS\) 拔山盖世算法 它是用来解决这样一类问题 \(y^x = z (mod\ p)\),给定\(y ...

  7. BSGS算法及其扩展

    bsgs算法: 我们在逆元里曾经讲到过如何用殴几里得求一个同余方程的整数解.而\(bsgs\)就是用来求一个指数同余方程的最小整数解的:也就是对于\(a^x\equiv b \mod p\) 我们可以 ...

  8. BSGS算法总结

    BSGS算法总结 \(BSGS\)算法(Baby Step Giant Step),即大步小步算法,用于解决这样一个问题: 求\(y^x\equiv z\ (mod\ p)\)的最小正整数解. 前提条 ...

  9. 【BZOJ2242】[SDOI2011]计算器 BSGS

    [BZOJ2242][SDOI2011]计算器 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ ...

随机推荐

  1. 从Java future 到 Guava ListenableFuture实现异步调用

    从Java future 到 Guava ListenableFuture实现异步调用 置顶 2016年04月24日 09:11:14 皮斯特劳沃 阅读数:17570 标签: java异步调用线程非阻 ...

  2. Java操作Redis小案例

    1.下载jar包. http://download.csdn.net/detail/u011637069/9594840包含本案例全部代码和完整jar包. 2.连接到redis服务. package ...

  3. SelfCert wcf中 生成x5.09证书的工具

    http://blog.pluralsight.com/selfcert-create-a-self-signed-certificate-interactively-gui-or-programma ...

  4. 记录一些比较长的adb命令,复制用

    adb shell content query --uri content://settings/secure --projection value --where "name=\'andr ...

  5. xcodebuild自动打包上传到蒲公英的shell脚本

    注意: ExportOptions.plist (包含了证书相关信息) 该plist 文件可以通过xcode手动导出ipa之后获取到, 区分appstore 和 development的情况 #! / ...

  6. The 13th Chinese Northeast Collegiate Programming Contest(B C E F H J)

    B. Balanced Diet 思路:把每一块选C个产生的价值记录下来,然后从小到大枚举C. #include<bits/stdc++.h> using namespace std; ; ...

  7. upc组队赛16 GCDLCM 【Pollard_Rho大数质因数分解】

    GCDLCM 题目链接 题目描述 In FZU ACM team, BroterJ and Silchen are good friends, and they often play some int ...

  8. Codeforce 464A. No to Palindromes!

    A. No to Palindromes! time limit per test 1 second memory limit per test 256 megabytes input standar ...

  9. saltstack基本操作第一篇章

    一.安装saltstack 1)官网安装 http://repo.saltstack.com/#rhel saltstack的模块:   https://www.unixhot.com/docs/sa ...

  10. OpenCV/Python/dlib眨眼检测

    今天我们来使用面部标志和OpenCV 检测和计算视频流中的眨眼次数. 为了构建我们的眨眼检测器,我们将计算一个称为眼睛纵横比(EAR)的指标,由Soukupová和Čech在其2016年的论文&quo ...