大数取模 快速幂 欧拉定理 欧拉函数
求a^b%mod a<=1e12 b<=1e100000 mod=1e9+7
已知欧拉定理 a^φ(n) ≡1%n(a与n互质)
b%φ(n)=t
b=k*φ(n)+t(k=0,1,2,3...)
a^b%mod=a^(K*φ(n)+t)%mod=(a^(k*φ(n))%mod)*a^t%mod)%mod=a^t%mod
(a^φ(n) ≡1%n=1, a^(k*a^φ(n) )=1;原式=(1*a^t)%mod )
用欧拉函数求出φ(n) b对φ(n)取模即可求出t
a^b%mod=a^t%mod;
欧拉函数:
1 ll euler(ll n){ //返回euler(n) 2 ll res=n,a=n; 3 for(ll i=2;i*i<=a;i++){ 4 if(a%i==0){ 5 res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出 6 while(a%i==0) a/=i; 7 } 8 } 9 if(a>1) res=res/a*(a-1); 10 return res; 11 }
快速幂:
1 ll PowerMod(ll a, ll b, ll mod){ 2 ll ans=1; 3 a%=mod; 4 while(b){ 5 if(b&1) ans=(ans*a)%mod; 6 b>>=1; 7 a=(a*a)%mod; 8 } 9 return ans; 10 }
大数取模:
1 ll MOD(char *s,ll m){ 2 ll len = strlen(s); 3 ll ans = 0; 4 for(ll i = 0; i < len; i++) 5 ans = (( ans*10 + s[i] - '0') % m); 6 return ans; 7 }