101550E Exponial (尤拉降冪)
阿新 • • 發佈:2018-12-18
題意:設函式,求exponial(n) mod m的值。
解法:利用尤拉降冪公式可得到遞推公式:
exponial(n) mod m=n^(exponial(n-1) mod φ(m)+φ(m)) mod m
注:
(1) 當模數為1的時候應直接返回0
(2)當exponial(n)的值比m小的時候,尤拉降冪公式會失效,所以應當把n<5時的值預處理出來
由於運算過程中不斷地對m取它的φ值,下降速度是很快的,所以不用擔心遞迴層數過多。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,m,PHI; ll phi(ll x) { ll ret=x; for(ll i=2;i*i<=x;++i) { if(x%i==0)ret=ret/i*(i-1); while(x%i==0)x/=i; } if(x>1)ret=ret/x*(x-1); return ret; } ll Pow(ll x,ll p,ll mod) { ll ret=1; while(p) { if(p&1)ret=ret*x%mod; x=x*x%mod; p>>=1; } return ret; } ll euler_pow(ll x,ll mod) { if(mod==1)return 0; if(x==1)return 1%mod; if(x==2)return 2%mod; if(x==3)return 9%mod; if(x==4)return (1ll<<18)%mod; ll PHI=phi(mod); return Pow(x,euler_pow(x-1,PHI)+PHI,mod); } int main() { scanf("%lld%lld",&n,&m); printf("%lld\n",euler_pow(n,m)); return 0; }