Super A^B mod C
欧拉降幂模板题:
欧拉公式:
欧拉函数:
ll phi(ll x)//欧拉函数
{
ll i;
ll num = x;
for(i = 2; i*i <= x; i++)
{
if(x % i == 0)
{
num = (num/i)*(i-1);
while(x % i == 0)
{
x = x / i;
}
}
}
if(x != 1) num = (num/x)*(x-1);
return num;
}
大数求余(同余模定理)
同余模定理
(a + b)%c = (a%c + b%c) % c;
(a * b)%c = (a%c * b%c) % c;
举例:
m=1234,模n
就等于 ((((110)%n+2%n)%n * 10%n+3%n)%n10%n+4%n)%n
板子:
ll big_mod(string big_num, ll _mod)
{
ll num = 0;
for(int i=0; i<big_num.size(); i++)//大数取模 同余模定理
{
num=(num*10 + (int)(big_num[i]-'0')) % _mod;
}
return num;
}
题解:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<iomanip>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define ll long long
#define mod 998244353
#define INF 0x3f3f3f3f
const int MAX = 1e5 + 10;
using namespace std;
ll big_mod(string big_num, ll _mod)
{
ll num = 0;
for(int i=0; i<big_num.size(); i++)//大数取模 同余模定理
{
num=(num*10 + (int)(big_num[i]-'0')) % _mod;
}
return num;
}
ll phi(ll x)//欧拉函数
{
ll i;
ll num = x;
for(i = 2; i*i <= x; i++)
{
if(x % i == 0)
{
num = (num/i)*(i-1);
while(x % i == 0)
{
x = x / i;
}
}
}
if(x != 1)
num = (num/x)*(x-1);
return num;
}
long long power(long long a,long long b,long long c)//快速幂
{
long long base=a,sum=1;
while(b!=0)
{
if(b&1)
sum=(sum*base) %c ;
base=(base*base) % c;
b>>=1;
}
return sum%c;
}
int main(void)
{
ll a,c;
string b;
while(cin>>a>>b>>c)
{
ll PHI = phi(c);
ll B = big_mod(b, PHI);
cout<<power(a, B, c)<<endl;
}
}