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 ...
随机推荐
- codevs1066&&noip引水入城
这道题 解决第一问 用灌水法 枚举第一行的每一个点 查找是否最后一行的每一个点是否都能灌到水 第二问 用反灌水发 枚举最后一行的每一个点 解决第一行每一个点所能覆盖的左右端点 可以证明每个点所能覆盖的 ...
- Codeforces Round #494 (Div. 3)
刚好在考完当天有一场div3,就开了个小号打了,打的途中被辅导员喊去帮忙,搞了二十分钟-_-||,最后就出了四题,题解如下:题目链接:http://codeforces.com/contest/100 ...
- [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度
Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...
- SQL注入文件读取通过from for分页读取
http://103.238.227.13:10088/?id=1 在读取文件的时候发现不能够一下子全部读取出来.经过百度学习了一下,看到别人使用from for说实在此前真不知道这操作. 先来看一下 ...
- JS中,children和childNodes的不同之处
<ul id="ul"><li></li><li></li><li><span></spa ...
- /proc/diskstats文件注解
/proc/diskstats 注解 今儿在准备利用shell监控磁盘读写次数等信息时,看到该文件,但是又不清楚每段的具体含义,这里备注下. 文件内容 [root@namenode proc]# ca ...
- Linux NAPI/非NAPI
本文主要介绍二层收包流程,包括NAPI与非NAPI方式: NAPI:数据包到来,第一个数据包产生硬件中断,中断处理程序将设备的napi_struct结构挂在当前cpu的待收包设备链表softnet_d ...
- Linux-进程间通信(四): 域套接字
1. 域套接字: (1) 只能用于同一设备上不同进程之间的通信: (2) 效率高于网络套接字.域套接字仅仅是复制数据,并不走协议栈: (3) 可靠,全双工: 2. 域套接字地址结构: struct s ...
- 【Educationcal Codeforces Round 21】
这场edu我原本以为能清真一点…… 后来发现不仅是七题 还有各种奇奇怪怪的骚操作…… A. 随便枚举 #include<bits/stdc++.h> using namespace std ...
- HTML5API(5)
一.SVG 1.svg与canvas的区别 canvas绘制的是位图,svg绘制的是矢量图 canvas使用JavaScript绘制,svg使用xml绘制 canvas不能给每个图形绑定事件,svg可 ...