hdu1211

来源:互联网 发布:淘宝店好评 编辑:程序博客网 时间:2024/05/04 02:43

这主要是读题很困难,而且没有给数据范围,这就导致有个本来应该用欧几里得拓展的部分,用暴力可以做。然后就是
题意
*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;}
0 0