题目:https://nanti.jisuanke.com/t/17414
题意:给出一个n(1~1e9),m(1~1e9),求exponial(n)%m的值
思路:欧拉降幂
注意n<= 4的时候的特判,因为我们没法直接判出B是否小于phi(C),因为递归得来的B已经是模phi(phi(C))的结果.
欧拉函数:对一个正整数N,欧拉函数是小于N且与N互质的数的个数.
例如φ(24)=8,因为1, 5, 7, 11, 13, 17, 19, 23均和 24 互质.
代码:
#include
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 2e5+5;
ll a[6] = {0,1,2,9,262144};
ll quick_pow(ll x,ll y,ll mod)
{
ll ans = 1;
while(y)
{
if(y&1)
ans = ans*x%mod;
y>>= 1;
x = x*x%mod;
}
return ans;
}
ll euler(ll x)
{
ll ans = x;
for(int i = 2;i*i<= x;i++)
{
if(x%i == 0)
{
ans-= ans/i;
while(x%i == 0) x/= i;
}
}
if(x> 1) ans-= ans/x;
return ans;
}
ll dfs(ll n,ll m)
{
if(m == 1) return 1;
if(n<= 4)
{
if(a[n]>= m) return a[n]%m+m;
return a[n]%m;
}
ll mod = euler(m);
ll ans = dfs(n-1,mod);
return quick_pow(n,ans,m)+m;
}
int main()
{
ll n,m;
cin>>n>>m;
ll tmp = dfs(n-1,euler(m));
tmp = quick_pow(n,tmp,m);
cout<