监狱有连续编号为 11 到 nn 的 nn 个房间,每个房间关押一个犯人。
有 mm 种宗教,每个犯人可能信仰其中一种。
如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。
求有多少种状态可能发生越狱。
输入格式
共一行,包含两个整数 mm 和 nn。
输出格式
可能越狱的状态数,对 100003100003 取余。
数据范围
1≤m≤1081≤m≤108,
1≤n≤10121≤n≤1012输入样例:
2 3
输出样例:
6
样例解释
所有可能的 66 种状态为:(000)(001)(011)(100)(110)(111)(000)(001)(011)(100)(110)(111)。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 100003;
int qsm(int a,int b){
int cnt1,cnt2=a;
cnt1=1;
while (b){
if(b&1)
{
cnt1*=cnt2;
cnt1=(cnt1+N)%N;
}
cnt2*=cnt2;
cnt2=(cnt2+N)%N;
b>>=1;
}
//cout<<cnt1<<endl;
return cnt1;
}
signed main()
{
int n,m;int nn,mm;
cin >> m >> n;
long long sky=qsm(m,n)-m*(qsm(m-1,n-1));
//sky=(sky+10000000*N)%N;
sky%=N;
sky+=N;
sky%=N;
cout<<sky;
}
参考:
本题可以采用容斥原理补集的思想。
考虑 nn 个犯人,mm种宗教,如何安排不会导致犯罪。
第一个位置可以有 mm 个选择,则与第一个相邻的第二个位置就只有 m−1m−1 中选择。
考虑第 ii 个位置,则为了不和他左侧的 i−1i−1 位置发生冲突,一共有 m−1m−1 种选择。
因此不会导致犯罪的方案是: m⋅(m−1)n−1m⋅(m−1)n−1
则会导致犯罪的方案是:mn−m⋅(m−1)n−1
作者:彩色铅笔
链接:https://www.acwing.com/solution/content/47738/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。