2019年蓝桥杯E题:RSA解密
/*知识点:
快速乘
快速幂
欧拉函数
寻找质数*/
# include <iostream>
using namespace std;
typedef long long num;
/*(a*b)%mod*/
num fast_mul(num a,num b,num mod)
{
num ans=0;
a=a%mod,b=b%mod;
while(b!=0){
if(b&1){
ans=(ans+a)%mod;
}
b>>=1;
a=(a+a)%mod;
}
return ans;
}
/*a^b%mod*/
num fast_pow(num a,num b,num mod)
{
num ans=1;
num fns=a;
while(b!=0){
if(b&1)
ans=fast_mul(ans,fns,mod);
fns=fast_mul(fns,fns,mod);
b>>=1;
}
return ans;
}
/*eular function*/
num euler(num n)
{
num ans=n;
for(num i=2;(i*i)<=n;i++)
{
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0)
n=n/i;
}
}
if(n>1)
ans=ans/n*(n-1);
return ans;
}
num find_q(num n)
{
for(num i=2;i<n;i++){
if(n%i==0)
return i;
}
}
int main()
{
num n=1001733993063167141,d=212353,C=20190324;/*known*/
num i,j,k;
num q,p,e,X;/*unknown*/
/*get q ,p ,k*/
q=find_q(n);
p=n/q;
k=(p-1)*(q-1);
/*get e*/
e=fast_pow(d,euler(k)-1,k);
/*find x*/
X=fast_pow(C,e,n);
cout<<X;
return 0;
}