AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1008
越狱
【题目描述】
监狱有连续编号为
1
……
每个房间关押一个犯人。
有
如果相邻房间的犯人的宗教相同,就可能发生越狱。
求有多少种状态可能发生越狱。
【输入】
输入两个整数
M
,
【输出】
可能越狱的状态数,模 100003 取余
【样例输入】
2 3
【样例输出】
6
【Solution】
这个题目我们可以应用补集转换的思想。
首先,我们先求出总状态数:
mn
,因为每个人都可以信奉一种宗教。
而要使相邻的罪犯信奉的宗教两两不相同,那么一共有
m⋅(m−1)n−1
种状态。
所以,我们所求的状态数就是
mn−m⋅(m−1)n−1
。
【Code】
- #include <iostream>
- #include <cstdio>
- #define LL long long
- #define MOD(x) (((x)%100003<0)?((x)%100003+100003):(x)%100003)
- using namespace std;
- LL n,m;
- LL power(LL a,LL b){
- if(b==0)return 1;
- if(b==1)return a;
- if(b&1){
- LL tmp=power(a,b/2);
- return MOD(MOD((tmp*tmp))*a);
- }
- else{
- LL tmp=power(a,b/2);
- return MOD((tmp*tmp));
- }
- }
- int main(){
- cin>>m>>n;
- cout<<MOD(MOD(power(m,n))-MOD(m)*(MOD(power(MOD((m-1)),(n-1)))))<<endl;
- return 0;
- }