HDU RSA

饭宝  金牌会员 | 2024-10-22 13:06:01 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 846|帖子 846|积分 2538


翻译成中文后:

思路:由题易得,d * e +y * f ( n ) = 1 ,且gcd ( e , f ( n ) ) = 1,以是用扩展欧几里得求出 d ,但要包管 d 好坏负的,最有用快速幂求出每个字符即可。
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. int exgcd(int a,int b,int &x,int &y){
  5.         if(b==0){
  6.                 x=1,y=0;
  7.                 return a;
  8.         }
  9.         int gcd=exgcd(b,a%b,y,x);
  10.         y-=a/b*x;
  11.         return gcd;
  12. }
  13. int ksm(int x,int y,int p){
  14.         int ans=1;
  15.         while(y){
  16.                 if(y&1) ans=ans*x%p;
  17.                 x=x*x%p;
  18.                 y>>=1;
  19.         }
  20.         return ans;
  21. }
  22. signed main(){
  23.         int p,q,e,l;
  24.         while(cin >> p >> q >> e >> l){
  25.                 int n=p*q,f=(p-1)*(q-1);
  26.                 while(l--){
  27.                         int c,x,y;
  28.                         cin >> c;
  29.                         int gcd=exgcd(e,f,x,y);
  30.                         x=(x+f)%f;
  31.                         cout << (char)ksm(c,x,n);
  32.                 }
  33.                 cout << endl;
  34.         }
  35.         return 0;
  36. }
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表