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!”。

输入输出样例

输入样例#1:

3 1
2 1 3
2 2 3
2 3 3
输出样例#1:

2
1
2
输入样例#2:

3 2
2 1 3
2 2 3
2 3 3
输出样例#2:

2
1
0
输入样例#3:

4 3
2 1 3
2 2 3
2 3 3
2 4 3
输出样例#3:

0
1
Orz, I cannot find x!
0

说明

分析

三个模板,

  1. 快速幂,
  2. 求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时无解
  3. 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]计算器的更多相关文章

  1. 洛谷 P2485 [SDOI2011]计算器 解题报告

    P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...

  2. luogu P2485 [SDOI2011]计算器

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

  3. 洛谷P2485 [SDOI2011]计算器(exgcd+BSGS)

    传送门 一题更比三题强 1操作直接裸的快速幂 2操作用exgcd求出最小正整数解 3操作用BSGS硬上 然后没有然后了 //minamoto #include<cstdio> #inclu ...

  4. BZOJ 2242 / Luogu P2485 [SDOI2011]计算器 (BSGS)

    type 1type\ 1type 1 就直接快速幂 type 2type\ 2type 2 特判+求逆元就行了. type 3type\ 3type 3 BSGS板 CODE #include< ...

  5. bzoj 2242: [SDOI2011]计算器 BSGS+快速幂+扩展欧几里德

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

  6. BZOJ 2242: [SDOI2011]计算器( 快速幂 + 扩展欧几里德 + BSGS )

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

  7. BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]

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

  8. BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS

    BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS 题意: 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p, ...

  9. 【bzoj2242】[SDOI2011]计算器

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3207  Solved: 1258[Submit][Statu ...

随机推荐

  1. Second Highest Salary

    Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | S ...

  2. 一、基础知识 React API 一览

    1.10 Hooks 参考文章:https://juejin.im/post/5be3ea136fb9a049f9121014 demo: /** * 必须要react和react-dom 16.7以 ...

  3. ajax的jquery写法和原生写法

    一.ajax的简介 Ajax被认为是(Asynchronous(异步) JavaScript And Xml的缩写).现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. 同步是指: ...

  4. vue实现选中列表功能

    <template> <div> <ul v-for="prop in items"> <dt>{{prop.name}}</ ...

  5. vue $set用法

    需求,想给下面的数据添加一个hoby属性 {{data.hoby}}-->让这里的视图改变 data:{ name: "简书", age: '3', info: { cont ...

  6. 如何下载Oracle E-Business Suite (12.2.6) for Microsoft Windows x64 (64-bit)

    下载地址:https://edelivery.oracle.com/ 使用您的 Oracle 账户进行登录.如果您没有该账户, 请注册 Oracle 账户.     Oracle Software D ...

  7. Android 仿电商app商品详情页按钮浮动效果

    1.效果图如下: 这效果用户体验还是很酷炫,今天我们就来讲解如何实现这个效果. 2.分析 为了方便理解,作图分析 如图所示,整个页面分为四个部分: 1.悬浮内容,floatView 2.顶部内容,he ...

  8. nginx配置文件语法高亮

    下载文件 nginx.vim https://vim.sourceforge.io/scripts/script.php?script_id=1886 安装 下载 nginx.vim 文件到 ~/.v ...

  9. matlab一次读取多张图片

    实验平台:matlab R2010Rb 读取C:\Users\KCl\Documents\MATLAB\SRCNN\Set5文件夹下所有bmp文件,并存储到im字典中 clear all clc im ...

  10. 关于java的自增问题

    程序执行结果是0,,,因为count永远是0