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 ...
随机推荐
- Java面试通关要点汇总集(山东数漫江湖)
这里,笔者结合自己过往的面试经验,整理了一些核心的知识清单,帮助读者更好地回顾与复习 Java 服务端核心技术.本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进行详细的剖析与解答.敬 ...
- 6、MySQL索引种类
1.普通索引 这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引. –直接创建索引 CRE ...
- Linux中查看进程占用内存的情况【转】
转自:http://hutaow.com/blog/2014/08/28/display-process-memory-in-linux/ Linux中查看某个进程占用内存的情况,执行如下命令即可,将 ...
- 基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析
[转自:http://blog.chinaunix.net/uid-20543672-id-3195249.html] 在学习Linux内核驱动的时候,一开始就会碰到copy_from_use ...
- 源码分析之tinyhttpd-0.1
1. 简介: tinyhttpd是使用c语言开发的超轻量级http服务器,通过代码流程可以了解http服务器的基本处理流程, 并且涉及了网络套接字,线程,父子进程,管道等等知识点: 项目地址:http ...
- notifier chain — 内核通知链【转】
转自:http://blog.csdn.net/g_salamander/article/details/8081724 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣 ...
- Docker壳的配置笔记
docker 就是一个运行容器,在这个盒子里,他的端口,路径可以虚拟到另一个实际的磁盘上,运行空间独立,更安全! yum install -y docker docker-client service ...
- ajax之深入解析(2)
我们前面实现了用原生的JavaScript代码实现ajax的异步数据传输.接下来,我们再使用一个流行的js框架jQuery来实现ajax. 通过 jQuery AJAX 方法,我们能够使用 HTTP ...
- 《深入浅出MyBatis技术原理与实战》——7. 插件
在第6章讨论了四大运行对象的运行过程,在Configuration对象的创建方法里我们看到了MyBatis用责任链去封装它们. 7.1 插件接口 在MyBatis中使用插件,我们必须使用接口Inter ...
- Django-分頁組件
一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib imp ...