你被要求设计一个计算器完成以下三项任务:
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)的最小非负整数。
标签:des style blog http color os io for 数据
输入包含多组数据。
1 #include <iostream> 2 #include <cmath> 3 #include <map> 4 using namespace std; 5 typedef long long LL; 6 int T,k; 7 LL mul_mod(LL a,LL b,LL n){ 8 return a*b%n; 9 } 10 LL pow_mod(LL a,LL p,LL n){ 11 if (p==0) return 1; 12 LL ans=pow_mod(a,p/2,n); 13 ans=ans*ans%n; 14 if (p&1) ans=ans*a%n; 15 return ans; 16 } 17 LL gcd(LL a,LL b){ 18 return (b==0)?a:(gcd(b,a%b)); 19 } 20 void exgcd(LL a,LL b,LL &x,LL &y){ 21 if (b==0) {x=1;y=0;return ;} 22 else {exgcd(b,a%b,y,x);y=y-(a/b)*x;} 23 } 24 LL inv(LL a,LL n){ 25 LL x,y; 26 exgcd(a,n,x,y); 27 return (x+n)%n; 28 } 29 LL log_mod(LL a,LL b,LL n){ 30 LL m,v,e=1,i; 31 m=((int)sqrt(n)) +1; 32 if (gcd(a,n)!=1) return -1; 33 v=inv(pow_mod(a,m,n),n); 34 map <int,int> x; 35 x[1]=0; 36 for (i=1;i<m;i++){ 37 e=mul_mod(e,a,n); 38 if (!x.count(e)) x[e]=i; 39 } 40 for (i=0;i<m;i++){ 41 if (x.count(b)) return i*m+x[b]; 42 b=mul_mod(b,v,n); 43 } 44 return -1; 45 } 46 int main(){ 47 cin>>T>>k; 48 LL y,z,p,t; 49 while (T--){ 50 cin>>y>>z>>p; 51 switch (k) { 52 case 1: 53 cout<<pow_mod(y,z,p)<<endl; break; 54 case 2:{ 55 LL g=gcd(y,p); 56 if (z%g!=0) cout<<"Orz, I cannot find x!"<<endl; 57 else { 58 y/=g;p/=g;z/=g; 59 cout<<mul_mod(inv(y,p),z%p,p)<<endl; 60 } 61 break; 62 } 63 case 3:if ((t=log_mod(y,z,p))==-1) cout<<"Orz, I cannot find x!"<<endl; 64 else cout<<t<<endl; 65 break; 66 } 67 } 68 return 0; 69 }
标签:des style blog http color os io for 数据
原文地址:http://www.cnblogs.com/yzh119/p/3957089.html