[BZOJ1008][HNOI2008]越獄
阿新 • • 發佈:2017-11-18
turn print space include 中一 bzoj1008 sam n-1 urn
監獄有連續編號為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種狀態,一共有n個位置,則總狀態數是m^n
然後是不能越獄的狀態數:第一個位置可以放m種狀態,後面(n-1)個位置每個只能放(m-1)種狀態(不能和前一個重復),則不能越獄的狀態數是m*(m-1)^(n-1)
則答案是m^n-m*(m-1)^(n-1),快速冪加速計算
100003總會給人一種不會爆int的錯覺,但是100000*100000=100億,會爆int。所以要開long long
#include<iostream> #include<cstdio> using namespace std; const long long mod=100003ll; long long ksm(long long x,long long p) { long long ans=1; while(p) { if(p&1)ans=(ans*x)%mod; x=(x*x)%mod;p>>=1; } return ans; } int main() { long long n;long long m;cin>>m>>n; printf("%d",(ksm(m,n)+mod-(m*ksm(m-1,n-1))%mod)%mod); return 0; }
[BZOJ1008][HNOI2008]越獄