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

[BZOJ1008][HNOI2008]越獄

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]越獄