BZOJ 2242 计算器
Description
你被要求设计一个计算器完成以下三项任务:
\(1.\)给定\(y,z,p\),计算\(y^{z}\;mod\;P\)的值;
\(2.\)给定\(y,z,p\),计算满足\(xy \equiv z\;mod\;P\)的最小非负整数;
\(3.\)给定\(y,z,p\),计算满足\(y^{x} \equiv z\;mod\;P\)的最小非负整数。
Input
输入包含多组数据。
第一行包含两个正整数\(T,K\)分别表示数据组数和询问类型(对于一个测试点内的所有数据,询问类型相同)。
以下行每行包含三个正整数\(y,z,p\),描述一个询问。
Output
对于每个询问,输出一行答案。对于询问类型\(2\)和\(3\),如果不存在满足条件的,则输出“Orz, I cannot find x!”,注意逗号与“I”之间有一个空格。
Sample Input
3 1
2 1 3
2 2 3
2 3 3
Sample Output
2
1
2
Hint
对于\(100\%\)的数据,\(1 \le y,z,P \le 10^{9}\),\(P\)为质数,\(1 \le T \le 10\)。
数论裸题合集:快速幂,扩展欧几里得,bsgs。
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<map>
using namespace std;
typedef long long ll;
int kind; ll ans;
inline ll qsm(ll a,ll b,ll c)
{
ll ret = 1;
for (;b;b >>= 1,(a *= a) %= c)
if (b & 1) (ret *= a) %= c;
return ret;
}
inline int gcd(int a,int b)
{
if (!b) return a;
return gcd(b,a%b);
}
inline ll bsgs(int a,int b,int c)
{
int i,t = 1;
for (i = 0;i<=50;i++)
{
if (t == b) return i;
t = (ll)t*(ll)a% c;
}
int tmp = 1,k = 1;
t = 1;
while (tmp = gcd(a,c),tmp!=1)
{
if (b % tmp) return -1;
c /= tmp; k++; b /= tmp;
t = (ll)t*(ll)a/tmp%c;
}
int m = (int)sqrt(c+0.5);
map <int,int> hash; hash[1] = 0;
int f = 1;
for (i = 1;i<m;i++)
{
f = (ll)f * (ll)a % c;
hash[f] = i;
}
f = (ll)f*(ll)a%c;
b = qsm(t,c-2,c)*(ll)b%c;
int mod = qsm(f,c-2,c);
for (i = 0;i<m;i++)
{
if (hash.count(b)) return i*m+hash[b]+k-1;
b = (ll)b * (ll)mod % c;
}
return -1;
}
int main()
{
freopen("2242.in","r",stdin);
freopen("2242.out","w",stdout);
int T; scanf("%d %d",&T,&kind);
while (T--)
{
int y,z,p;
scanf("%d %d %d",&y,&z,&p);
if (kind == 1) ans = qsm(y,z,p);
else if (kind == 2)
{
y %= p,z %= p;
int d = gcd(y,p);
if (z % d != 0) ans = -1;
else
{
y /= d, p /= d,z /= d;
ans = z*qsm(y,p-2,p)%p;
}
}
else ans = bsgs(y,z,p);
if (ans >= 0) printf("%lld\n",ans);
else printf("Orz, I cannot find x!\n");
}
fclose(stdin); fclose(stdout);
return 0;
}
BZOJ 2242 计算器的更多相关文章
- 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]计算器
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
- bzoj 2242 [SDOI2011]计算器(数论知识)
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
- [BZOJ 2242] [SDOI 2011] 计算器
Description 你被要求设计一个计算器完成以下三项任务: 给定 \(y,z,p\),计算 \(y^z \bmod p\) 的值: 给定 \(y,z,p\),计算满足 \(xy≡ z \pmod ...
- BZOJ.2242.[SDOI2011]计算器(扩展欧几里得 BSGS)
同余方程都不会写了..还一直爆int /* 2.关于同余方程ax ≡b(mod p),可以用Exgcd做,但注意到p为质数,y一定有逆元 首先a%p=0时 仅当b=0时有解:然后有x ≡b*a^-1( ...
- BZOJ 2242 [SDOI2011]计算器(快速幂+Exgcd+BSGS)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2242 [题目大意] 给出T和K 对于K=1,计算 Y^Z Mod P 的值 对于K=2 ...
- bzoj 2242 [SDOI2011]计算器——BSGS模板
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242 第一道BSGS! 咳咳,我到底改了些什么?…… 感觉和自己的第一版写的差不多……可能是 ...
随机推荐
- Oracle 安装安全补丁过程中出现的问题
为Oracle安装安全补丁,首先在官网上下载相应版本的补丁. 根据官方文档的说明安装,但是在安装的过程中会出项各种各样的错误,这里仅仅把我遇到的记录下来,给大家提供参考. 首先按照官方文档安装. 在这 ...
- Android(java)学习笔记171:Service生命周期
1.Service的生命周期 Android中的Service(服务)与Activity不同,它是不能和用户交互,不能自己启动的,运行在后台的程序,如果我们退出应用的时候,Servic ...
- user.table.column, table.column 或列说明无效
Oracle统计采用别名出错(user.table.column, table.column 或列说明无效) >>>>>>>>>>>& ...
- 复旦大学2016--2017学年第一学期高等代数I期末考试情况分析
一.期末考试成绩班级前十名 宁盛臻(100).朱民哲(92).徐钰伦(86).范凌虎(85).沈伊南(84).何陶然(84).丁知愚(83).焦思邈(83).董瀚泽(82).钱信(81) 二.总成绩计 ...
- 第一章 SQL基础
第一部分:SQL基础1. 为什么学习SQL自人类社会形成之日起,社会的运转就在不断地产生和使用各种信息(文献.档案.资料.数据等):在如今所谓的信息时代,由于计算机和互联网的作用,信息的产生和使用达到 ...
- 阿里云服务器(Win 2008 R2 Standard)安装MSSM 2008 R2之1033和2052问题
最近在给租用的阿里云服务器安装Sql Server 2008 R2 Express时,遭遇下面的问题.经过几番折腾后,终于解决问题,完成安装,这里总结分享我的解决方法,希望能给遇到相同问题的小伙伴们节 ...
- 使用Ubuntu 新建vpn过程
1.更新软件源 sudo apt-get update 2.安装pip sudo apt-get install python-pip 3.安装shadowsocks s ...
- 2D动态光照
对场景内所有点发出射线, 如果射线被某条边阻挡, 则射线停留在阻挡的边上, 如果射线顺利抵达终点, 则对射线偏移-0.001, +0.001角度, 再射出2条射线, 停留在后续的阻挡边上. 把最终的射 ...
- [lua]尝试一种Case语法糖
function CaseT(arg) function proxy(caller) caller.yield(r) end -- proxy return function (cond) if (c ...
- redis数据类型(字符串)
字符串 这是最简单Redis类型.如果你只用这种类型,Redis就像一个可以持久化的memcached服务器 127.0.0.1:6379> set mykey somevalue OK 127 ...