很基本的东西,给初学者看看吧……
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Int unsigned __int64
Int inline Modular(Int a,Int b,Int n)
{
Int sum=0;
Int k=b;
if(a==0)return 0;
while(k)
{
if(k&1)
{
if((sum=sum+a)>n) sum-=n;
}
k>>=1;
if((a<<=1)>n) a-=n;
}
return sum;
}
Int inline Greatest_common_divisor(Int a,Int b) //a>b
{
if(b==0)return a;
return Greatest_common_divisor(b,a%b);
}
Int Extend_Greatest_common_divisor(Int a,Int b,Int &x,Int &y,Int t) //a>b
{
Int temp,d,m;
if(b==0)
{
x=1;
y=0;
return a;
}
d=Extend_Greatest_common_divisor(b,a%b,x,y,t);
temp=x;
x=y;
m=a/b%t;
y=(temp+t-Modular(m,x,t))%t;
return d;
}
Int Pollard_Rho(Int n)
{
l1:
Int d;
time_t t;
srand((unsigned)time(&t));
Int x=rand()%n;
Int y=x;
Int i=1;
Int k=2;
Int c=rand()%(n-2)+1;
Int T=80000;
while(T--)
{
i++;
x=Modular((x+n-c)%n,(x+c)%n,n);
d=Greatest_common_divisor(2*n+y-x,n);
if(d!=1&&d!=n)return d;
if(i==k)
{
y=x;
k<<=1;
}
}
goto l1;
}
Int Mod_2(Int b,Int n,Int p)
{
Int k=n;
Int a=1;
while(k>0)
{
if(k&1)
{
a=Modular(a,b,p);
}
k>>=1;
b=Modular(b,b,p);
}
return a;
}
int main()
{
Int C,E,N,p,q,t;
Int x,y;
while(EOF!=scanf("%I64u%I64u%I64u",&C,&E,&N))
{
p=Pollard_Rho(N);
q=N/p;
t=(p-1)*(q-1);
if(E<t) Extend_Greatest_common_divisor(t,E,y,x,t);
else Extend_Greatest_common_divisor(E,t,x,y,t);
printf("%I64u\n",Mod_2(C,x,N));
}
return 0;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课