越獄(倆個快速冪相減如果為負數就加上mod)
阿新 • • 發佈:2020-12-28
題目: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; }