1. 程式人生 > 實用技巧 >越獄(倆個快速冪相減如果為負數就加上mod)

越獄(倆個快速冪相減如果為負數就加上mod)

題目:https://www.acwing.com/problem/content/1292/
監獄有連續編號為 11 到 nn 的 nn 個房間,每個房間關押一個犯人。
有 mm 種宗教,每個犯人可能信仰其中一種。
如果相鄰房間的犯人信仰的宗教相同,就可能發生越獄。
求有多少種狀態可能發生越獄。
輸入格式:
共一行,包含兩個整數 mm 和 nn。
輸出格式:
可能越獄的狀態數,對 100003100003 取餘。
資料範圍
1≤m≤108 //10的8次方
1≤n≤1012//10的12次方
輸入樣例:
2 3
輸出樣例:
6
樣例解釋
所有可能的 66 種狀態為:(000)(001)(011)(100)(110)(111)(000)(001)(011)(100)(110)(111)。

題解:
所有的方案數是m的n次方,那麼不會發生越獄的情況是m*(m-1)的(n-1)次方,這裡分別用快速冪來求就行,只不過相減的時候可能出現負數的情況,這個時候需要加上mod就行(重點,記住)

#include <iostream>
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxx = 1e6+10;
const int mod=100003;
int ans=0;
int qmi(int a,ll k)
{
    int res=1;
    while(k){
        if(k&1)res=(ll)res*a%mod;
        k=k>>1;
        a=(ll)a*a%mod;
    }
    return res;
}
void solve()
{
  int m;
  ll n;
  cin>>m>>n;   //這裡相減可能為負數,那麼就給它加上mod
  cout<<(qmi(m,n)-(ll)m*qmi(m-1,n-1)%mod+mod)%mod<<endl;
}
int main()
{
    solve();
    return 0;
}