Accept: 936 Submit: 3059
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).
Input
Output
Sample Input
Sample Output
Source
欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。
通式:φ(x)=x*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
对于质数p,φ(p) = p - 1。注意φ(1)=1.
欧拉定理:对于互质的正整数a和n,有aφ(n) ≡ 1 mod n。
欧拉函数是积性函数——
若m,n互质,φ(mn)=φ(m)φ(n)。
若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。
特殊性质:当n为奇数时,φ(2n)=φ(n)
欧拉函数还有这样的性质:
设a为N的质因数,若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N / a) * a;若(N % a == 0 && (N / a) % a != 0) 则有:E(N) = E(N / a) * (a - 1)。
ll ol(ll x)
{
ll i,res=x;
for(i=2;i*i<=x;i++)
{
if(x%i==0)
{
res=res-res/i;
while(x%i==0)
x/=i;
}
}
if(x>1)
res=res-res/x;
return res;
}
欧拉函数知道后,呢就直接上降幂公式了,该公式的证明就不在说了,挺难的。
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef __int64 ll;
#define inf 1000000000
#define mod 1000000007
#define maxn 1000006
#define lowbit(x) (x&-x)
#define eps 1e-10
char s[maxn];
ll ol(ll x)
{
ll i,res=x;
for(i=2;i*i<=x;i++)
{
if(x%i==0)
{
res=res-res/i;
while(x%i==0)
x/=i;
}
}
if(x>1)
res=res-res/x;
return res;
}
ll q(ll x,ll y,ll MOD)
{
ll res=1;
while(y)
{
if(y%2)
res=res*x%MOD;
x=x*x%MOD;
y/=2;
}
return res;
}
int main(void)
{
ll a,c,i,ans,tmp,b;
while(scanf("%I64d%s%I64d",&a,s,&c)!=EOF)
{
ans=0;b=0;tmp=ol(c);
ll len=strlen(s);
for(i=0;i<len;i++)
b=(b*10+s[i]-'0')%tmp;
b+=tmp;
ans=q(a,b,c);
printf("%I64d\n",ans);
}
return 0;
}