P3197 [HNOI2008]越獄(快速冪)
阿新 • • 發佈:2019-01-19
tom con gin hnoi2008 img vertica bits div sin
題目描述
監獄有連續編號為 1…N1…N1…N 的 NNN 個房間,每個房間關押一個犯人,有 MMM 種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄。
輸入輸出格式
輸入格式:輸入兩個整數 M,NM,NM,N
輸出格式:可能越獄的狀態數,模 100003100003100003 取余
輸入輸出樣例
輸入樣例#1: 復制2 3
輸出樣例#1: 復制
6
說明
6種狀態為(000)(001)(011)(100)(110)(111)
1≤M≤ 10^8
1≤N≤10^12
思路:
思考總數 - 合法的狀態數(即鄰房間的犯人的宗教不相同);
因為每個牢房的犯人都可以信仰 m 種 宗教,所以說一共有 mnmn 種組合。
當一個牢房的犯人信仰一種宗教後,相鄰的牢房的犯人只可以信仰 剩下的 m-1種 中的一種才不會越獄,即:
所以說 這是 m?(m?1)n?1m?(m?1)n?1 種;
所以說答案就是 mn?m?(m?1)n?1mn?m?(m?1)n?1
因為我們在過程中mod過,減出來可能為負,我們需要 (ans + mod)%mod
1 #include"bits/stdc++.h" 2 using namespace std; 3 typedef long long ll; 4 5 ll n,m; 6 const ll mod = 100003; 7 8 ll powmod(ll a,ll b)9 { 10 ll base = a%mod; 11 ll ans = 1; 12 13 while (b) 14 { 15 if (b&1) ans=ans*base%mod; 16 // cout<<b<<" "<<base<<endl; 17 b>>=1; 18 base=base*base%mod; 19 20 21 22 } 23 24 return ans; 25 } 26 27 28 29 30 31 int main() 32{ 33 //cout<<powmod(2,4); 34 35 cin>>m>>n; 36 37 cout<<(powmod(m,n) -( m*powmod(m-1,n-1))%mod+mod)%100003; 38 39 }
P3197 [HNOI2008]越獄(快速冪)