Description
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
Input
输入两个整数M,N.1<=M<=10^8,1<=N<=10^12
Output
可能越狱的状态数,模100003取余
Sample Input
Sample Output
HINT
6种状态为(000)(001)(011)(100)(110)(111)
Source
直接求显然不好求,思路转化一下
显然有两种情况,能越狱的和不能越狱的(废话ing
既然能越狱的不好求,那么考虑一下不能越狱的
总数是m^n显然
第一个人有m种可能,因为不能越狱
第二个人有(m-1)种可能
第三个人有(m-1)中可能。。。
那么根据乘法原理得不能越狱的为m*(m-1)^(n-1)
所以能越狱的用总数一减即可
这么水的题目也WA了一次,快速幂传参居然传了个int 我也是蠢哭。。
另外注意下mod的减法,要考虑到减后是负数的情况
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int mod=100003;
typedef long long LL;
LL n,m,a,tmp,ans;
void pow_mod(LL x){
if(x==0){ans=1;return;}
if(x==1){ans=a;return;}
pow_mod(x>>1);
ans=(ans*ans)%mod;
if(x&1)ans=(ans*a)%mod;return;
}
int main(){
scanf("%lld%lld",&m,&n);
a=m%mod;pow_mod(n);
tmp=ans;
a=(m-1)%mod;pow_mod(n-1);
ans=(ans*m)%mod;
ans=(tmp-ans+mod)%mod;
printf("%lld\n",ans);
return 0;
}