您的位置:首页 > 其它

BZOJ 1008 越狱

2015-07-24 11:27 274 查看

Description

监狱有连续编号为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)

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: