这个题刚看上去的时候其实我也不会,所以我百度了很多,主要还是这个题的知识点我都没有学过,所以拿到之后毫无办法,好了,开始步入正题
首先,还有d*e/(p-1)(q-1)=□余1,这个如果学过欧几里得扩展的话,一看就能看出来,而那个次方就更简单了,直接用快速幂,如果暴力的话,可能会爆掉。
扩展欧几里得
long long e_gcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=2;
return a;
}
long long ans=e_gcd(b,a%b,x,y);
long long temp=x;
x=y;
y=temp-a/b*y;
return ans;
}
快速幂
LL binaryPow(LL a,LL b,LL m)
{
if(b==0)//b为0,则a^0=1;
return 1;
if(b%2==1)//b为奇数,则转化为b-1;
return a*binaryPow(a,b-1,m)%m;
else
{//b为偶数,转化为b/2;
LL mul=binaryPow(a,b/2,m);
return mul*mul%m;
}
}
//我看到这个题以为是用快速幂,结果发现快速幂爆掉了,而且看了大佬的代码,才知道用的是快速乘求余,很笨,o(╯□╰)o
long long quickmul(long long a,long long b)
{
long long sum=0;
while(b)
{
if(b%2==1)
sum=(sum+a)%n;
a=(a+a)%n;
b=b/2;
}
return sum;
}
long long quickmod(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b%2==1)
ans=quickmul(ans,a);
a=quickmul(a,a);
b=b/2;
}
return ans;
}
全部代码:
#include <bits/stdc++.h>
using namespace std;
long long n=1001733993063167141;
long long d=212353;
long long c=20190324;
long long p=891234941;
long long q=1123984201;
long long e=823816093931522017;
long long phi=(p-1)*(q-1);
void Ex_gcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
long long x1,y1;
Ex_gcd(b,a%b,x1,y1);
x=y1;
y=x1-(a/b)*y1;
}
long long quickmul(long long a,long long b)
{
long long sum=0;
while(b)
{
if(b%2==1)
sum=(sum+a)%n;
a=(a+a)%n;
b=b/2;
}
return sum;
}
long long quickmod(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b%2==1)//末位是1;
ans=quickmul(ans,a);//这是直接的回溯法,从最后一位起,如果,如果最后一位是1,则乘a,然后在进行乘以它本身,以为乘1之后一定为偶数,也就是b/2;
a=quickmul(a,a);
b=b/2;
}
return ans;
}
int main()
{
long long x,y;
Ex_gcd(d,(q-1)*(p-1),x,y);
x=(x+phi)%phi;
printf("e=%lld\n",x);
printf("ans=%lld\n",quickmod(c,e));
return 0;
}
作者:兔蠢蠢
来源:CSDN
原文:https://blog.csdn.net/ftx456789/article/details/89075158
版权声明:本文为博主原创文章,转载请附上博文链接!