这主要是读题很困难,而且没有给数据范围,这就导致有个本来应该用欧几里得拓展的部分,用暴力可以做。然后就是
题意
*RSA是个很强大的加密数据的工具,对RSA系统的描述如下:选择两个大素数p、q,计算n = p q,F(n) = (p-1)(q-1),选择一个整数e,使得gcd(e,F(n)) = 1,e是公匙,计算d使得d e mod F(n) = 1 mod F(n),d是私匙。加密数据的方法为C = E(m) = m^e mod n解密数据的方法为M = D(c) = c^d mod n其中,c是密文中字母的ASCII的值;m是明文中字母的ASCII的值。现在问题来了,给你p、q、e和一些密文,请把密文翻译成明文。
**暴力可以解决,数据比较水
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int work(int a , int n , int m)
{
int res = 1;
while(n){
if(n & 1){
res = (res * a) % m;
}
a = (a * a) % m;
n >>= 1;
}
return res;
}
int fun(int a,int b,int n)
{
//返回a^b%n 蒙哥马利罗比算法
int res=1;;
while(b)
{
if(b%2)
{
res*=a;
res%=n;
}
a*=a;
a%=n;
b/=2;
}
return res;
}
int main()
{
int p , q , e , l ;
while(~scanf("%d%d%d%d", &p , &q , &e , &l)){
int n = p * q;
int f = (p - 1)*(q - 1);
int d = f / e + 1;
while(1){
if(d*e%f == 1) break;
else d++;
}
char ans;
int mi;
for(int i = 0 ; i < l ; i++){
scanf("%d",&mi);
printf("%c",fun(mi , d , n));
}
printf("\n");
}
return 0;
}