hdu1211

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值