監獄有連續編號爲 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; }