BZOJ 2242 [SDOI2011]计算器(快速幂+Exgcd+BSGS)

时间:2023-02-24 22:11:08

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2242

【题目大意】

  给出T和K
  对于K=1,计算 Y^Z Mod P 的值
  对于K=2,计算满足 xy≡ Z ( mod P ) 的最小非负整数
  对于K=3,计算满足 Y^x ≡ Z ( mod P) 的最小非负整数

【题解】

  K=1情况快速幂即可

  K=2情况用exgcd求解

  K=3用BSGS求解

【代码】

#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <tr1/unordered_map>
using namespace std::tr1;
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
int phi(int n){
int t=1,i;
for(i=2;i*i<=n;i++)if(n%i==0)for(n/=i,t*=i-1;n%i==0;n/=i,t*=i);
if(n>1)t*=n-1;
return t;
}
int pow(ll a,int b,int m){ll t=1;for(;b;b>>=1,a=a*a%m)if(b&1)t=t*a%m;return t;}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int exgcd(int a,int b,int&x,int&y){
if(!b)return x=1,y=0,a;
int d=exgcd(b,a%b,x,y),t=x;
return x=y,y=t-a/b*y,d;
}
int bsgs(int a,int r,int m){
if(r>=m)return -1;
int i,g,x,c=0,at=int(2+sqrt(m));
for(i=0,x=1%m;i<50;i++,x=ll(x)*a%m)if(x==r)return i;
for(g=x=1;__gcd(int(ll(x)*a%m),m)!=g;c++)g=__gcd(x=ll(x)*a%m,m);
if(r%g)return -1;
if(x==r)return c;
unordered_map<int,int>u;
g=phi(m/g),u[x]=0;g=pow(a,g-at%g,m);
for(i=1;i<at;i++){
u.insert(P(x=ll(x)*a%m,i));
if(x==r)return c+i;
}
for(i=1;i<at;i++){
unordered_map<int,int>::iterator t=u.find(r=ll(r)*g%m);
if(t!=u.end())return c+i*at+t->second;
}return -1;
}
// 计算 Y^Z Mod P 的值
void solve1(ll y,int z,int p){printf("%d\n",pow(y,z,p));}
// 计算满足 xy≡ Z ( mod P ) 的最小非负整数
void solve2(int y,int z,int p){
p=-p;
int t=gcd(y,p);
if(z%t){puts("Orz, I cannot find x!");return;}
y/=t;z/=t;p/=t;
int a,b;exgcd(y,p,a,b);
a=(ll)a*z%p;
while(a<0)a+=p;
printf("%d\n",a);
}
// 计算满足 Y^x ≡ Z ( mod P) 的最小非负整数
void solve3(int y,int z,int p){
y%=p; z%=p;
int t=bsgs(y,z,p);
if(t==-1){puts("Orz, I cannot find x!");return;}
else printf("%d\n",t);
}
int main(){
int T,k,y,z,p;
while(~scanf("%d%d",&T,&k)){
while(T--){
scanf("%d%d%d",&y,&z,&p);
if(k==1)solve1(y,z,p);
if(k==2)solve2(y,z,p);
if(k==3)solve3(y,z,p);
}
}return 0;
}

BZOJ 2242 [SDOI2011]计算器(快速幂+Exgcd+BSGS)的更多相关文章

  1. BZOJ 2242&colon; &lbrack;SDOI2011&rsqb;计算器&lpar; 快速幂 &plus; 扩展欧几里德 &plus; BSGS &rpar;

    没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...

  2. BZOJ 2242&colon; &lbrack;SDOI2011&rsqb;计算器 &lbrack;快速幂 BSGS&rsqb;

    2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...

  3. bzoj 2242 &lbrack;SDOI2011&rsqb;计算器 快速幂&plus;扩展欧几里得&plus;BSGS

    1:快速幂  2:exgcd  3:exbsgs,题里说是素数,但我打的普通bsgs就wa,exbsgs就A了...... (map就是慢)..... #include<cstdio> # ...

  4. 【BZOJ2242】【SDoi2011】计算器 快速幂&plus;EXGCD&plus;BSGS

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  5. bzoj 2242&colon; &lbrack;SDOI2011&rsqb;计算器 BSGS&plus;快速幂&plus;扩展欧几里德

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...

  6. BZOJ 2242 &lbrack;SDOI2011&rsqb;计算器 ——EXGCD&sol;快速幂&sol;BSGS

    三合一的题目. exgcd不解释,快速幂不解释. BSGS采用了一种不用写EXGCD的方法,写起来感觉好了很多. 比较坑,没给BSGS的样例(LAJI) #include <map> #i ...

  7. bzoj 2242&colon; &lbrack;SDOI2011&rsqb;计算器【扩展欧几里得&plus;快速幂&plus;BSGS】

    第一问快速幂板子 第二问把式子转化为\( xy\equiv Z(mod P)\rightarrow xy+bP=z \),然后扩展欧几里得 第三问BSGS板子 #include<iostream ...

  8. BZOJ 2242 &lbrack;SDOI2011&rsqb;计算器 BSGS&plus;高速幂&plus;EXGCD

    题意:id=2242">链接 方法: BSGS+高速幂+EXGCD 解析: BSGS- 题解同上.. 代码: #include <cmath> #include <c ...

  9. BZOJ&period;2242&period;&lbrack;SDOI2011&rsqb;计算器&lpar;扩展欧几里得 BSGS&rpar;

    同余方程都不会写了..还一直爆int /* 2.关于同余方程ax ≡b(mod p),可以用Exgcd做,但注意到p为质数,y一定有逆元 首先a%p=0时 仅当b=0时有解:然后有x ≡b*a^-1( ...

随机推荐

  1. UVa 10815 安迪的第一个字典

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. 基于 backbone的弹窗插件

    define(['backbone', 'jquery', 'text!creditCardTpl/page.html'], function (bacobone, jquery, dialog_tp ...

  3. Quartz 2D--长方形和线条绘图

    今天原本想模仿2048 游戏的. 但是在设计背景环境时,涉及到绘图的知识!于是就开始对绘图进行了一翻学习. 若想自己绘图必须 写自己的View(继承UICView):然后重写UIView 中的 dra ...

  4. python 安装 ez&lowbar;setup&period;py出现的问题及解决办法

    试了网上好几个解决办法. 下面这个办法是最对我胃口的.  ~~~~~~~~~~~~~~~~ 安装ez_setup.py时出现了这个问题: UnicodeDecodeError: 'ascii' cod ...

  5. Spring Cloud官方文档中文版-Spring Cloud Config(上)

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...

  6. cobbler自动化安装系统

    笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 在很久很久以前,使用kickstart实现自动化安装的时候,我一直认为装系统是多么高大上的活,直到cobbler的 ...

  7. python---面向对象高级进阶

    静态方法,调用静态方法后,该方法将无法访问类变量和实例变量 class Dog(object): def __init__(self,name): self.name = name def eat(s ...

  8. MySQL 水平拆分与垂直拆分详解

    前言:说到优化mysql,总会有这么个回答:水平拆分,垂直拆分,那么我们就来说说什么是水平拆分,垂直拆分. 一.垂直拆分 说明:一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将 ...

  9. 对接携程供应商php加密解密类

    php加密解密类 <?php class Aes{ private $key = '6b4d63211b4ba869'; private $iv = 'dbbf079b95004f65'; pu ...

  10. C入门注意事项

        C语言入门应该注意什么   进入IT行业,很多人一开始接触的都是C语言,C语言可以说是一门基础课程了,只要有了C语言的基础,那么以后不管是学什么语言都会比较容易上手.同时在学习其它语言时也可以 ...