正题
题目链接:https://www.luogu.org/problem/P5091
题目大意
求abmod  ma^b\mod mabmodm
欧拉定理及扩展
欧拉定理:
对于(a,m)=1(a,m)=1(a,m)=1那么有aφ(m)≡1(modm)a^{\varphi(m)}\equiv 1(mod\ m)aφ(m)≡1(mod m)
扩展欧拉定理
ab≡{ab%φ(p)+φ(p)(b>φ(p))ab%φ(p)(b≤φ(p))(modp)a^b\equiv \left\{\begin{matrix}a^{b\%\varphi(p)+\varphi(p)}(b>\varphi(p)) \\ a^{b\%\varphi(p)}(b\leq\ \varphi(p)) \end{matrix}\right.(mod\ p)ab≡{ab%φ(p)+φ(p)(b>φ(p))ab%φ(p)(b≤ φ(p))(mod p)
解题思路
然而本题是扩展欧拉定理,直接计算即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define ll long long
using namespace std;
ll a,p,phi,b;
char c;bool flag;
ll power(ll x,ll b,ll p)
{ll ans=1;while(b){if(b&1) ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
int main()
{scanf("%lld%lld",&a,&p);phi=p;ll P=p;for(ll i=2;i*i<=p;i++)if(p%i==0){phi=phi*(i-1)/i;while(!(p%i)) p/=i;}if(p>1) phi=phi*(p-1)/p;while(!isdigit(c=getchar()));for(;isdigit(c);c=getchar()){b=b*10+c-'0';if(b>=phi)b%=phi,flag=1;}b+=phi*flag;printf("%lld",power(a,b,P));
}