Description

你被要求设计一个计算器完成以下三项任务:
1、给定y,z,p,计算Y^Z Mod P 的值;
2、给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数;
3、给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数。

Input

输入包含多组数据。

第一行包含两个正整数T,K分别表示数据组数和询问类型(对于一个测试点内的所有数据,询问类型相同)。
以下行每行包含三个正整数y,z,p,描述一个询问。

Output

对于每个询问,输出一行答案。对于询问类型2和3,如果不存在满足条件的,则输出“Orz, I cannot find x!”,注意逗号与“I”之间有一个空格。

Sample Input

【样例输入1】
3 1
2 1 3
2 2 3
2 3 3
【样例输入2】
3 2
2 1 3
2 2 3
2 3 3
【数据规模和约定】
对于100%的数据,1<=y,z,p<=10^9,为质数,1<=T<=10。

Sample Output

【样例输出1】
2
1
2
【样例输出2】
2
1
0

HINT

 

Source

Solution:第一问快速幂
      第二问EXGCD
      第三问BSGS
BSGS(Baby Step Giant Step)网上介绍的很详细了,但是我令x=im-j这样就不用求逆元辣,相应的为了不出现负数是i从1开始到m枚举,则j从1到m枚举,因为可以等于m,j就不需要从0开始啦.。
另:一开始在CV上测,用了puts试试,忘了自带换行在CV上过了,然而在BZOJ PE了233
 #include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#define ll long long
using namespace std;
ll y,z,p; ll fast_pow(ll y,ll z,ll p)
{
ll ans=;
while (z)
{
if (z&) ans=ans*y%p;
y=y*y%p;
z>>=;
}
return ans;
} ll gcd(ll a,ll b)
{return b==?a:gcd(b,a%b);} void ex_gcd(ll a,ll b,ll &x,ll &y)
{
if (!b) {x=;y=;return;}
ex_gcd(b,a%b,x,y);
ll t=x; x=y; y=t-a/b*y;
} void solve1()
{
printf("%lld\n",fast_pow(y,z,p));
} void solve2()
{
ll d=gcd(y,p);
if (z%d) {printf("Orz, I cannot find x!\n");return;}
y/=d; z/=d;
ll a,b;
ex_gcd(y,p,a,b);
a=a*z%p;
while (a<) a+=p;
printf("%lld\n",a);
} void solve3()
{
y%=p,z%=p;
if (!y && !z) {puts(""); return;}
if (!y) {printf("Orz, I cannot find x!\n");return;}
map<ll,ll> mp;
mp.clear();
ll m=ceil(sqrt(p));
ll t=fast_pow(y,m,p),k=z%p;//直接m即可
for (int i=;i<m;i++)
{
if (!mp[k]) if (i) mp[k]=i;//注意变量,及时订正。
else mp[k]=-;
k=k*y%p;
}
k=;
for (int i=;i<m;i++)
{
if (mp[k])//注意!mp与mp的判断
{
if (mp[k]==-) mp[k]=;
printf("%lld\n",i*m-mp[k]);
return;
}
k=k*t%p;
}
printf("Orz, I cannot find x!\n");//各种傻
} int main()
{
int T,t;
scanf("%d%d",&T,&t);
while (T--)
{
scanf("%lld%lld%lld",&y,&z,&p);
if (t==) solve1();
if (t==) solve2();
if (t==) solve3();
}
}

最新文章

  1. 【leetcode】length of last word (easy)
  2. struts.custom.i18n.resources国际化
  3. git 初次使用
  4. [物理学与PDEs]第1章习题参考解答
  5. [Everyday Mathematics]20150114
  6. IE自动化
  7. Sql Server根据表名获得所有列及其属性
  8. U3D简单得换装技术
  9. C#实现基于ffmepg加虹软的人脸识别
  10. .NET之RabbitMQ学习笔记(一)-应用场景
  11. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证
  12. 蚂蚁金服ATEC城市峰会上海举行,三大发布迎接金融科技2019
  13. 认识与防御XSS攻击
  14. Angular 学习笔记 (Material Datepicker)
  15. 文件内容比较difflib
  16. java web 机试
  17. LeetCode题解之Largest Number
  18. PHP 练习(租房子)
  19. Linux服务器CPU、内存、磁盘空间、负载情况查看python脚本
  20. React Native(五)&mdash;&mdash;获取设备信息react-native-device-info

热门文章

  1. android:id=&quot;@id/resid&quot; , andorid:id=&quot;@+id/resid&quot; 的区别
  2. 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))
  3. eclipse基础及开发插件
  4. Linux 端口-&gt; PID -&gt; 启动目录
  5. golang debug with LiteIDE
  6. 数据结构之图 Part3 – 1 遍历
  7. ereg/eregi报错处理办法
  8. linux下mysql的简单使用
  9. 跟着鸟哥学Linux系列笔记2-第10章VIM学习
  10. ASP.NET 5探险(7):使用混合型控制器方便实现单页应用