其实题意可以这样理解,已知e,n,F(n),且gcd(e,F(n))=1
求d使得
d*e = 1 mod F(n)。
由扩展欧几里得算法可求出d。
然后给一个整数an,输出
(an)^d (mod n)的对应的字符。(显然快速幂搞定)
#include
#include
#include
using namespace std;
typedef long long ll;
ll gcd_ex(ll a,ll b,ll &x,ll &y)
{
if(!b) {x=1;y=0;return a;}
ll d=gcd_ex(b,a%b,y,x);
y-=a/b*x;
return d;
}
ll quick_mul(ll a,ll b,ll m)
{
ll res=0;
a%=m,b%=m;
while(b>0)
{
if(b&1) res=(res+a)%m;
b>>=1;
a=(a<<1)%m;
}
return res;
}
ll quick_pow(ll a,ll b,ll m)
{
ll res=1;
a%=m;
while(b>0)
{
if(b&1) res=quick_mul(res,a,m);
b>>=1;
a=quick_mul(a,a,m);
}
return res;
}
int main(int argc, char const *argv[])
{
int p,q,e,l;
while(scanf("%d %d %d %d",&p,&q,&e,&l)!=EOF)
{
ll n=(ll)p*(ll)q,fn=(ll)(p-1)*(ll)(q-1),x,y;
gcd_ex((ll)e,fn,x,y);
x=(x%fn<0)?(x%fn+fn):x%fn;
while(l--)
{
scanf("%lld",&y);
printf("%c",(char)quick_pow(y,x,n) );
}
putchar('
');
}
return 0;
}