监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
输入两个整数M,N.1<=M<=10^8,1<=N<=10^12
可能越狱的状态数,模100003取余
6种状态为(000)(001)(011)(100)(110)(111)
一开始从越狱的状态去考虑,发现很难搞。于是乎正难则反,我去考虑合法的状态,合法的状态就是m*(m-1)*(m-1)......是((m-1)^(n-1))*m,而总数是m^n,减一下就可以了。至于怎么算,快速幂即可。
#include<cstdio> #include<iostream> using namespace std; const long long mod=100003; long long m,n,t,x,y,s,ans; int main() { cin>>m>>n; t=n-1; x=1; s=m%mod; while(n!=0) { if(n%2==1) x=(x*s)%mod; n=n/2; s=(s*s)%mod; } y=1; s=(m-1)%mod; while(t!=0) { if(t%2==1) y=(y*s)%mod; t=t/2; s=(s*s)%mod; } y=(y*m)%mod; ans=((x-y)+mod)%mod; cout<<ans<<endl; return 0; }