//强烈晕倒,也可以说是不注意吧。scanf("%ld%ld%ld%ld",&p,&q,&e,&l)&&p!=EOF后面的p是不能做判断的,因为已经到文件尾了。
这道题我用的是快速指数算法+欧几里得算法,经典的rsa,终于让我实在地领略了一遍。
#include<stdio.h>
long int f,n,d;
//快速指数算法,大意是把任何一个指数运算x^y的指数y分成2^n(n=0,1,2……)求和,2^n<=y<2^n+1,这样使得x^y=a0*x^2^0+a1*x^2^1……+an*x^2^n。
long int ex(long int c,long int e)
{
long int t=e,y=1;
while(t!=0)
{
if(t%2==0)
{
c=c*c%n;
t=t>>1;
}
else
{
y=c*y%n;
t--;
}
}
return y;
}
int main()
{
long int i,p,q,e,l,c,t,y,s,v;
while(scanf("%ld%ld%ld%ld",&p,&q,&e,&l)!=EOF)
{
n=p*q;
f=(p-1)*(q-1);
d=s=f/e+1;//欧几里得算法
t=v=e-f%e;
while(t!=1)
{
s=e/t+1;
t=t-e%t;
d=(d*s-1)%f;
}
//对每个输入的密文用快速指数运算求解明文
for(i=0;i<l;i++)
{
scanf("%ld",&c);
printf("%c",ex(c,d));
}
printf("/n");
}
return 0;
}