- 监狱有连续编号为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)
- 这题不是很难。统计可能越狱的状态是很难的,但是不越狱的状态是可以统计出来的。
- 第一个人可以任意选择宗教,后面的n-1个人每个人都只有m-1个宗教可以选择(不能跟他们前面的一样),所以,不越狱的状态数是m*(m-1)^(n-1)
- 总状态数是m^n,所以答案就是:ans=m^n-m*(m-1)^(n-1)
- 用快速幂可以轻松水过
- 下面贴代码
-
#include<iostream> using namespace std; typedef long long ll; int mod=100003; ll pow(ll x,ll n) { ll res=1; while(n>0) { if(n&1) res=res*x%mod; x=x*x%mod; n>>=1; } return res; } int main() { long long m,n; cin>>m>>n; long ans; ans=((pow(m,n)%mod)-(m%mod)*(pow(m-1,n-1)%mod)%mod)%mod; if(ans<0)ans+=mod; //最后得注意,由于是取模后减的,所以可能减出负数,这边就得处理一下了 cout<<ans<<endl; return 0; }