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

[HNOI2008]越獄

ans 整數 size ostream namespace iostream 輸入輸出格式 ret hnoi

題目描述

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

輸入輸出格式

輸入格式:

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1:
2 3
輸出樣例#1:
6

說明

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

簡單到不像省選題,原本打算用半小時,結果只用了5分鐘

所有狀態m^n,不符合條件的狀態:

第一個有m種選擇,接下來n-1個為(m-1)種,所以總數:m*(m-1)^(n-1)

ans=m^n-m*(m-1)^(n-1)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int p=100003;
 7 long long ans1,ans2;
 8 long long qpow(long long x,long long m)
 9 {
10     if (m==0) return 1;
11     long long tmp=qpow(x,m/2);
12 tmp=(tmp*tmp)%p; 13 if (m%2==1) tmp=(tmp*x)%p; 14 return tmp; 15 } 16 int main() 17 {long long m,n; 18 cin>>m>>n; 19 ans1=qpow(m,n); 20 ans2=(m*qpow(m-1,n-1))%p; 21 cout<<(ans1-ans2+p)%p; 22 }

[HNOI2008]越獄