题目描述

你被要求设计一个计算器完成以下三项任务:

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

说明

本蒟蒻调了一下午样例,一个都没过

然后交上去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]计算器的更多相关文章

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

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

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

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

  3. P2485 [SDOI2011]计算器

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

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

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

  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. [Luogu 2486] SDOI2011 染色

    [Luogu 2486] SDOI2011 染色 树剖水题,线段树维护. 详细题解不写了. 我只想说我写的线段树又变漂亮了qwq #include <algorithm> #include ...

随机推荐

  1. div 超出高度滚动条,超出宽度点点点

    超出高度滚动条 style="width:230px; height: 180px; overflow: auto;" 超出宽度点点点 style="width: 220 ...

  2. hdu 1233 还是畅通工程 (最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    ...

  3. 启动Eclipse时,弹出failed to load the jni shared library

    JDK版本和Eclipse版本不同的问题,JDK版本为64位,Eclipse版本为32位.

  4. Python3 学习第一天总结

    一.python介绍 1.python是一门动态解释性的强类型定义语言: 简单解释一下: 定义变量不需要定义类型的为动态语言:典型的有Python和Ruby,反之定义变量需要定义类型的为静态语言:典型 ...

  5. 为什么Windows7打开项目的方式是灰的不能修改

    http://jingyan.baidu.com/article/d3b74d64a964691f77e60900.html 进入组策略编辑器,即运行gpedit.msc,进入“用户配置”-“管理模板 ...

  6. Yii 1.1.17 六、开启路由与使用缓存

    一.开启路由 1.在配置文件main.php的components中 定义如下: // 定义路由 'urlManager'=>array( // URL模式为PATHINFO 'urlForma ...

  7. ARM linux的启动部分源代码简略分析【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/11/07/2396784.html ARM linux的启动部分源代码简略分析 以友善之臂的mini2 ...

  8. 【POJ2420】A star not a tree?

    蒟蒻开始学模拟退火…… 起初一直不肯学,因为毕竟玄学算法…… 哎呀玄学怎么就没用呢?对不对? #include<iostream> #include<cstdio> #incl ...

  9. bzoj 1798 维护序列seq

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 题解: 高级一点的线段树,加上了区间乘法运算,则需要增加一个数组mulv记录乘的因数 ...

  10. freemark学习

    学习地址: http://blog.csdn.net/hejinxu/article/details/6694890   对freemarker的用法与语法进行了详细的讲解 http://freema ...