HNOI 越獄

題目描述

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

輸入輸出格式

輸入格式:ios

輸入兩個整數 M,Ngit

輸出格式:spa

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

 

衆所周知,這種求有多少種狀態的題均可以從反面想,也就是用全部狀態減去全部不可行的狀態。htm

這道題也就能夠用這種方法,全部狀態是N^Mblog

而不可行的狀態:get

第一我的可能有M種宗教,若是不發生越獄,第二我的必須與第一我的不一樣,有M-1種。string

第三我的不能和第二我的相同,可是能夠和第一我的相同,因此也是M-1,it

以此類推,一共有M*(M-1)^(N-1)種不會發生越獄的狀況。

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define MAXN 100010
#define in(a) a=read()
#define REP(i,k,n) for(int i=k;i<=n;i++)
using namespace std;
inline long long read(){
    long long x=0,f=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar())
        if(ch=='-')
            f=-1;
    for(;isdigit(ch);ch=getchar())
        x=x*10+ch-'0';
    return x*f;
}
long long n,m,mod;
long long ksm(long long a,long long b){
    long long ans=1;
    while(b){
        if(b%2==1)  ans=((ans%mod)*(a%mod))%mod;
        a=(a*a)%mod;
        b/=2;
    }
    return ans%mod;    
}
int main(){
    mod=100003;
    in(m),in(n);
    long long p=(ksm(m,n)%mod-m*ksm(m-1,n-1)%mod)%mod;
    if(p<0)  p=(p+mod)%mod;
    cout<<p;
    return 0;
}
相關文章
相關標籤/搜索