翻译成中文后:
思路:由题易得,d * e +y * f ( n ) = 1 ,且gcd ( e , f ( n ) ) = 1,所以用扩展欧几里得求出 d ,但要保证 d 是非负的,最有用快速幂求出每个字符即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1,y=0;
return a;
}
int gcd=exgcd(b,a%b,y,x);
y-=a/b*x;
return gcd;
}
int ksm(int x,int y,int p){
int ans=1;
while(y){
if(y&1) ans=ans*x%p;
x=x*x%p;
y>>=1;
}
return ans;
}
signed main(){
int p,q,e,l;
while(cin >> p >> q >> e >> l){
int n=p*q,f=(p-1)*(q-1);
while(l--){
int c,x,y;
cin >> c;
int gcd=exgcd(e,f,x,y);
x=(x+f)%f;
cout << (char)ksm(c,x,n);
}
cout << endl;
}
return 0;
}