【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2242

【题目大意】

  给出T和K
  对于K=1,计算 Y^Z Mod P 的值
  对于K=2,计算满足 xy≡ Z ( mod P ) 的最小非负整数
  对于K=3,计算满足 Y^x ≡ Z ( mod P) 的最小非负整数

【题解】

  K=1情况快速幂即可

  K=2情况用exgcd求解

  K=3用BSGS求解

【代码】

#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <tr1/unordered_map>
using namespace std::tr1;
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
int phi(int n){
int t=1,i;
for(i=2;i*i<=n;i++)if(n%i==0)for(n/=i,t*=i-1;n%i==0;n/=i,t*=i);
if(n>1)t*=n-1;
return t;
}
int pow(ll a,int b,int m){ll t=1;for(;b;b>>=1,a=a*a%m)if(b&1)t=t*a%m;return t;}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int exgcd(int a,int b,int&x,int&y){
if(!b)return x=1,y=0,a;
int d=exgcd(b,a%b,x,y),t=x;
return x=y,y=t-a/b*y,d;
}
int bsgs(int a,int r,int m){
if(r>=m)return -1;
int i,g,x,c=0,at=int(2+sqrt(m));
for(i=0,x=1%m;i<50;i++,x=ll(x)*a%m)if(x==r)return i;
for(g=x=1;__gcd(int(ll(x)*a%m),m)!=g;c++)g=__gcd(x=ll(x)*a%m,m);
if(r%g)return -1;
if(x==r)return c;
unordered_map<int,int>u;
g=phi(m/g),u[x]=0;g=pow(a,g-at%g,m);
for(i=1;i<at;i++){
u.insert(P(x=ll(x)*a%m,i));
if(x==r)return c+i;
}
for(i=1;i<at;i++){
unordered_map<int,int>::iterator t=u.find(r=ll(r)*g%m);
if(t!=u.end())return c+i*at+t->second;
}return -1;
}
// 计算 Y^Z Mod P 的值
void solve1(ll y,int z,int p){printf("%d\n",pow(y,z,p));}
// 计算满足 xy≡ Z ( mod P ) 的最小非负整数
void solve2(int y,int z,int p){
p=-p;
int t=gcd(y,p);
if(z%t){puts("Orz, I cannot find x!");return;}
y/=t;z/=t;p/=t;
int a,b;exgcd(y,p,a,b);
a=(ll)a*z%p;
while(a<0)a+=p;
printf("%d\n",a);
}
// 计算满足 Y^x ≡ Z ( mod P) 的最小非负整数
void solve3(int y,int z,int p){
y%=p; z%=p;
int t=bsgs(y,z,p);
if(t==-1){puts("Orz, I cannot find x!");return;}
else printf("%d\n",t);
}
int main(){
int T,k,y,z,p;
while(~scanf("%d%d",&T,&k)){
while(T--){
scanf("%d%d%d",&y,&z,&p);
if(k==1)solve1(y,z,p);
if(k==2)solve2(y,z,p);
if(k==3)solve3(y,z,p);
}
}return 0;
}

最新文章

  1. top命令详解(转,详细)
  2. Jquery 读取表单选中值
  3. git 使用笔记(二)
  4. 海贼王之&mdash;&mdash;梦想音乐
  5. nodejs mongodb
  6. C++ Primer笔记7_STL之关联容器
  7. JavaScript详解
  8. 文科生细谈学习Linux系统的重要性
  9. 利用vue-router和compoment重构代码--踩坑(一)
  10. 介绍几款 Python 类型检查工具
  11. HttpServletRequest内容处理工具类
  12. NOIP 普及组 2016 海港
  13. ROS初级教程 cmake cmakelist.txt 的编写教程
  14. map的基本操作函数
  15. 一台电脑存放多个git账户的多个rsa秘钥(转)
  16. Python虚拟环境中pip install时没有权限问题
  17. KVM资源划分分配技巧
  18. Alpha阶段敏捷冲刺---Day2
  19. TensorFlow 简单实例
  20. Generator生成器函数

热门文章

  1. HDU 1180 诡异的楼梯 (广搜)
  2. list互转datatable 支持Nullable转换
  3. 有向有权图的最短路径算法--Dijkstra算法
  4. php快速入门总结
  5. STM32-内存管理
  6. python 学习笔记 sqlalchemy
  7. jQuery通过Ajax向PHP服务端发送请求并返回JSON数据
  8. Elasticsearch源码分析(一)启动流程 ModuleBuilder injector
  9. MapReduce案例二:好友推荐
  10. poj 1962(并查集+带权更新)