P2485 [SDOI2011]计算器
P2485 [SDOI2011]计算器
题目描述
你被要求设计一个计算器完成以下三项任务:
1、给定y、z、p,计算y^z mod p 的值;
2、给定y、z、p,计算满足xy ≡z(mod p)的最小非负整数x;
3、给定y、z、p,计算满足y^x ≡z(mod p)的最小非负整数x。
为了拿到奖品,全力以赴吧!
输入输出格式
输入格式:
输入文件calc.in 包含多组数据。
第一行包含两个正整数T、L,分别表示数据组数和询问类型(对于一个测试点内的所有数
据,询问类型相同)。
以下T 行每行包含三个正整数y、z、p,描述一个询问。
输出格式:
输出文件calc.out 包括T 行.
对于每个询问,输出一行答案。
对于询问类型2 和3,如果不存在满足条件的,则输出“Orz, I cannot find x!”。
输入输出样例
3 1
2 1 3
2 2 3
2 3 3
2
1
2
3 2
2 1 3
2 2 3
2 3 3
2
1
0
4 3
2 1 3
2 2 3
2 3 3
2 4 3
0
1
Orz, I cannot find x!
0
说明

分析
三个模板,
- 快速幂,
- 求yx=z(mod p),转化成,yx-kp = z;可以用扩展欧几里得求解,并且要求z%gcd(y,p)!=0,(扩展欧几里得求ax+by=c:http://www.cnblogs.com/MashiroSky/p/5912977.html), 补充:因为p是质数,所以可以用费马小定理, p是质数,y与p互质,所以y有逆元,x=y^(-1)*z,y^(-1)=y^(p-2),因为0没有逆元,所以只有y=0时无解
- bsgs
注意,int与longlong类型,结尾的换行符
code
#include<iostream>
#include<cstdio>
#include<map>
#include<cmath> using namespace std;
typedef long long LL;
map<int,int>mp; int ksm(int a,int p,int mod)
{
int now = ;
while (p)
{
if (p&)
now = 1ll*now*a%mod;
a = 1ll*a*a%mod;
p = p>>;
}
return now;
}
int exgcd(int a,int b,int &x,int &y)
{
if (b==)
{
x = , y = ;
return a;
}
int r = exgcd(b,a%b,x,y);
int t = x;
x = y;
y = t-(a/b)*y;
return r;
}
void bsgs(int a,int b,int p)
{
int m,t,ans,now;
if (a%p==&&b==)
{
printf("1\n");return ;
}
if (a%p==)
{
printf("Orz, I cannot find x!\n");return ;
}
mp.clear();
m = ceil(sqrt(p));
now = b%p;
mp[now] = ;
for (int i=; i<=m; ++i)
{
now = (1ll*now*a)%p;
mp[now] = i;
}
t = ksm(a,m,p);
now = ;
for (int i=; i<=m; ++i)
{
now = (1ll*now*t)%p;
if (mp[now])
{
ans = i*m-mp[now];
printf("%d\n",(ans%p+p)%p);
return ;
}
}
printf("Orz, I cannot find x!\n");
}
int main()
{
int t,k,a,b,c;
scanf("%d%d",&t,&k);
if (k==)
{
for (int i=; i<=t; ++i)
scanf("%d%d%d",&a,&b,&c),printf("%d\n",ksm(a,b,c));
}
else if (k==)
{
int x,y;
for (int i=; i<=t; ++i)
{
scanf("%d%d%d",&a,&b,&c);
int d = exgcd(a,c,x,y);
if (b%d!=) printf("Orz, I cannot find x!\n"); //换行符
else
{
x = 1ll*x*(b/d)%c;
x = (x%(c/d)+c/d)%(c/d);
printf("%d\n",x);
}
}
}
else
{
for (int i=; i<=t; ++i)
scanf("%d%d%d",&a,&b,&c),bsgs(a,b,c);
}
return ;
}
P2485 [SDOI2011]计算器的更多相关文章
- 洛谷 P2485 [SDOI2011]计算器 解题报告
P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...
- luogu P2485 [SDOI2011]计算器
题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给定y.z.p,计算 ...
- 洛谷P2485 [SDOI2011]计算器(exgcd+BSGS)
传送门 一题更比三题强 1操作直接裸的快速幂 2操作用exgcd求出最小正整数解 3操作用BSGS硬上 然后没有然后了 //minamoto #include<cstdio> #inclu ...
- BZOJ 2242 / Luogu P2485 [SDOI2011]计算器 (BSGS)
type 1type\ 1type 1 就直接快速幂 type 2type\ 2type 2 特判+求逆元就行了. type 3type\ 3type 3 BSGS板 CODE #include< ...
- bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 你被 ...
- BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )
没什么好说的... --------------------------------------------------------------------- #include<cstdio&g ...
- BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]
2242: [SDOI2011]计算器 题意:求\(a^b \mod p,\ ax \equiv b \mod p,\ a^x \equiv b \mod p\),p是质数 这种裸题我竟然WA了好多次 ...
- BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS
BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS 题意: 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p, ...
- 【bzoj2242】[SDOI2011]计算器
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3207 Solved: 1258[Submit][Statu ...
随机推荐
- concurrent.futures模块与协程
concurrent.futures —Launching parallel tasks concurrent.futures模块同时提供了进程池和线程池,它是将来的使用趋势,同样我们之前学习 ...
- window.open()方法详解
, 最基本的弹出窗口代码 window.open('page.html'); 2, 经过设置后的弹出窗口 window.open('page.html', 'newwindow', 'heig ...
- js addEventListener调用传参函数
先看这段代码 function abc(key){ console.log(key); } for(let i=0;i<oInput.length;i++){ oInput[i].addEven ...
- [转]Linux中如何读写硬盘上指定物理扇区
读指定物理扇区: dd if=<源设备> of=<输出设备或文件> skip=<指定扇区值> bs=512 count=1 写指定物理扇区: dd i ...
- Angular ui-route介绍
参考博客: https://www.cnblogs.com/haogj/p/4885928.html 原文地址:http://www.ng-newsletter.com/posts/angular-u ...
- oracle 11g r2卸载
1. 进入计算机管理>>服务里,停止所有oracle的服务 2. 开始菜单>>程序>>Oracle>>Oracle安装产品>>Univers ...
- 【转】chrome浏览器的跨域设置——包括版本49前后两种设置
做前后分离的webapp开发的时候,出于一些原因往往需要将浏览器设置成支持跨域的模式,好在chrome浏览器就是支持可跨域的设置,网上也有很多chrome跨域设置教程.但是新版本的chrome浏览器提 ...
- Softmax回归(Softmax Regression
多分类问题 在一个多分类问题中,因变量y有k个取值,即.例如在邮件分类问题中,我们要把邮件分为垃圾邮件.个人邮件.工作邮件3类,目标值y是一个有3个取值的离散值.这是一个多分类问题,二分类模型在这里不 ...
- ATM-core-src
from interface import bank, shopping, userfrom lib import common user_data = { 'name': None} def log ...
- web前端使用localstorage、sessionstorage、cookie增删获方法
今天主要的学习内容是cookie与本地储存的知识, 在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别, ...