1. 程式人生 > >P3197 [HNOI2008]越獄(快速冪)

P3197 [HNOI2008]越獄(快速冪)

tom con gin hnoi2008 img vertica bits div sin

題目描述

監獄有連續編號為 1…N1…N1N 的 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]越獄(快速冪)