1. 程式人生 > >bzoj1008[HNOI2008]越獄

bzoj1008[HNOI2008]越獄

inpu clu 它的 long 我們 AC amp led www

傳送門

Description

  監獄有連續編號為1...N的N個房間,每個房間關押一個犯人,有M種宗教,每個犯人可能信仰其中一種。如果
相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄

Input

  輸入兩個整數M,N.1<=M<=10^8,1<=N<=10^12

Output

  可能越獄的狀態數,模100003取余

Sample Input

2 3

Sample Output

6

HINT

  6種狀態為(000)(001)(011)(100)(110)(111)

題解:

我們可以從逆向思考,對於每一種宗教,它的下一個位置有m-1種選擇,因此不會越獄的情況有m*(m-1)^(n-1)種,總情況有m^n種,因此會越獄有m^n-m*(m-1)^(n-1)種,用快速冪即可求出答案。

代碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #define ll long long
 8 #define mo 100003
 9 using namespace std;
10 ll m,n,ans;
11 ll qui(ll x,ll t){
12     ll a=1;x=x%mo;
13     while
(t){ 14 if(t&1) a=a*x%mo; 15 x=x*x%mo; 16 t>>=1; 17 } 18 return a; 19 } 20 int main(){ 21 scanf("%lld%lld",&m,&n); 22 ans=qui(m,n); 23 ll k=m*qui(m-1,n-1)%mo; 24 ans-=k; 25 while(ans<0) ans+=mo; 26 ans%=mo; 27 printf("%lld\n
",ans); 28 return 0; 29 }

bzoj1008[HNOI2008]越獄