luogu 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
说明

本蒟蒻调了一下午样例,一个都没过
然后交上去ac,
突然意识到windows的 lld 和 I64d似乎从来没准过,orz orz 并且快速幂不知道怎么也写炸了
第一问,水 快速幂+mod
第二问,可用exgcd求,
当z为gcd(a,p)的倍数时才有解。
第三问,用bsgs(拔山盖世)求的是离散对数
具体可以自行百度。
#include<cstdio>
#include<map>
#include<cmath>
using namespace std; typedef long long LL;
int T,L; LL qpow(LL a,LL p,LL mod)
{
LL base=a;
LL sum=;
while(p!=)
{
if(p&)
sum=(sum*base)%mod;
base=(base*base)%mod;
p>>=;
}
return sum;
} void work1()
{
LL y,z,p;
scanf("%lld%lld%lld",&y,&z,&p);
printf("%lld\n",qpow(y,z,p)%p);
return ;
} void exgcd(int a,int b,LL &d,LL &x,LL &y)
{
if(!b){d=a;x=;y=;return ;}
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
LL gcd(LL a,LL b)
{
if(!b) return a;
return gcd(b,a%b);
}
void work2()
{
LL a,b,y,z,x,d,mod;
scanf("%lld%lld%lld",&y,&z,&mod);
a=y;
b=-mod;
d=gcd(a,b);
if(z%d)
{
printf("Orz, I cannot find x!\n");
return ;
}
a/=d;b/=d;z/=d;
exgcd(a,b,d,x,y);
x*=z;x%=b;
while(x<) x+=b;
printf("%lld\n",x);
} map<LL,LL>mp;
void work3()
{
mp.clear();
LL y,z,q,p;
scanf("%lld%lld%lld",&y,&z,&p);
y%=p;
if(!y&&!z)
{
puts("");return ;
}
if(!y)
{
printf("Orz, I cannot find x!\n");
return;
}
LL pos=ceil(sqrt(p));
LL ans;
for(LL i=;i<=pos;i++)
{
if(i==)
{
ans=z%p;
mp[ans]=;
continue;
}
ans=(ans*y)%p;
mp[ans]=i;
}
ans=;
LL t=qpow(y,pos,p);
for(LL i=;i<=pos;i++)
{
ans=(ans*t)%p;
if(mp[ans])
{
LL b=i*pos-mp[ans];
printf("%d\n",(b%p+p)%p);
return ;
}
}
printf("Orz, I cannot find x!\n");
}
int main()
{
scanf("%d%d",&T,&L);
if(L==)
for(int i=;i<=T;i++)
work1();
if(L==)
for(int i=;i<=T;i++)
work2();
if(L==)
for(int i=;i<=T;i++)
work3();
return ;
}
luogu P2485 [SDOI2011]计算器的更多相关文章
- BZOJ 2242 / Luogu P2485 [SDOI2011]计算器 (BSGS)
type 1type\ 1type 1 就直接快速幂 type 2type\ 2type 2 特判+求逆元就行了. type 3type\ 3type 3 BSGS板 CODE #include< ...
- 洛谷 P2485 [SDOI2011]计算器 解题报告
P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...
- P2485 [SDOI2011]计算器
P2485 [SDOI2011]计算器 题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最 ...
- 洛谷P2485 [SDOI2011]计算器(exgcd+BSGS)
传送门 一题更比三题强 1操作直接裸的快速幂 2操作用exgcd求出最小正整数解 3操作用BSGS硬上 然后没有然后了 //minamoto #include<cstdio> #inclu ...
- 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, ...
- [Luogu 2486] SDOI2011 染色
[Luogu 2486] SDOI2011 染色 树剖水题,线段树维护. 详细题解不写了. 我只想说我写的线段树又变漂亮了qwq #include <algorithm> #include ...
随机推荐
- bzoj 3035 二分答案+二分图最大匹配
大原来做的一道题,偷懒直接粘的原来的程序 http://www.cnblogs.com/BLADEVIL/p/3433520.html /******************************* ...
- 跨域iframe高度计算
一.同域获取iframe内容 这里有两个细节: 1. 取iframe内的文档对象,标准浏览器使用contentDocument属性,IE低版本(IE6,7,8)使用document属性. 2. cal ...
- hdu 1272 小希的迷宫(并查集+最小生成树+队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...
- EditText中inputType详解
<EditText Android:layout_width="fill_parent" android:layout_height="wrap_content&q ...
- python进行机器学习(二)之特征选择
毫无疑问,解决一个问题最重要的是恰当选取特征.甚至创造特征的能力,这叫做特征选取和特征工程.对于特征选取工作,我个人认为分为两个方面: 1)利用python中已有的算法进行特征选取. 2)人为分析各个 ...
- qgis 插件开发
qgis 插件开发 http://blog.csdn.net/v6543210/article/details/40480341
- ASP.NET MVC 文件上传
如果想要用HTML表单实作文件上传的功能,那么必须在输出的<form>表单标签加上一个enctype属性,且内容必须设定为multipart/form-data,要通过Html.Begin ...
- C中级 数据序列化简单使用和讨论 (二)
引言 - 一种更好的方式 其实不管什么语言, 开发框架都会遇到序列化问题. 序列化可以理解为A 和 B 交互的一种协议. 很久以前利用 printf 和 scanf 的协议实现过一套序列化问题. C ...
- 前言-关于学习OC还是学习Swift的个人理解
一直在考虑一个问题!到底是学swift好呢还是学OC好. 然后得到了解答: 1.如果你只是对苹果系统软件开发有兴趣,把开发作为一种业务爱好,那么选swift就没错,swift也是大势所趋. 2.如果你 ...
- python 数据类型 变量 注释
基本数据类型: 数字 number :整数 int . 浮点数 float.复数 complex.布尔值 bool 列表 list : 使用 方括号 [] 表示,例如: [1,2,'abc'] ...