1. 程式人生 > 其它 >leetcode-56. 合併區間

leetcode-56. 合併區間

結論

把結論記錄下,其實費馬小定理就是尤拉降冪的一個衍生

\(\phi(x)\)表示\(x\)的尤拉函式

對於非特殊的情況下

\[ a^b=\left\{ \begin{array}{rcl} a^b & & {b<\phi(m)}\\ a^{b\;mod\;\phi(m)+\phi(m)} & & {b \geq \phi(m)}\\ \end{array} \right. \]

對於\(\gcd(a,m)=1\)

\(a^b=a^{b\;mod\; \phi(m)}\)

\(\phi(質數)=質數-1\)

所以就可以得到費馬小定理的結論\(a^b=a^{b\;mod\;(m-1)}\)

注意對於非特殊情況的\(+\phi(m)\)不能省略

模板題

程式碼

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a,m,b;
int get(int x){
    ll ans=x;
    for(ll i=2;i*i<=x;i++){
        if(x%i==0){
            ans=ans/i*(i-1);
            while(x%i==0){
                x=x/i;
            }
        }
    }
    if(x!=1){
        ans=ans/x*(x-1);
    }
    return ans;
}
int qpow(int a,int b){
    ll ans=1,base=a;
    while(b){
        if(b&1) ans=ans*base%m;
        base=base*base%m;
        b=b>>1;
    }
    return ans;
}
int main(){
   scanf("%d%d",&a,&m);
   int mod=get(m);
   char ch;
   bool flag=0;
   while((ch=getchar())!=-1){
        if(ch==' ') continue;
        b=b*10+ch-'0';
        if(b>mod) b%=mod,flag=1;
   }
   if(flag) b+=mod;
   printf("%d\n",qpow(a,b));
   return 0;
}

卷也卷不過,躺又躺不平