您的位置:首页 > 其它

BZOJ 1008: [HNOI2008]越狱 计数原理

2017-10-02 17:35 190 查看

1008: [HNOI2008]越狱

Time Limit: 1 Sec Memory Limit: 162 MB

Submit: 10200 Solved: 4417

[Submit][Status][Discuss]

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

题解:

很基础的排列组合。

可以发现直接算的话不好算,但是我们可以算到总共的情况数和相邻两个都不相邻的情况数,直接想减就好了。

之前想成了任两个都不相同的情况数……但其实只要它和左边一个不相同就可以了。

#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;

const int mod = 100003;

ll m,n;

ll mpow(ll a,ll b){
ll rt=1;
for(rt;b;b>>=1,a=1LL*a*a%mod)
if(b&1) rt=1LL*rt*a%mod;
return rt%mod;
}

int main(){
cin>>m>>n;
ll ans=(mpow(m,n)+mod-(m*mpow(m-1,n-1)%mod))%mod;
cout<<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: