https://www.luogu.com.cn/problem/P3197
题目描述
监狱有 个房间,每个房间关押一个犯人,有 种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
答案对 取模。
输入格式
输入只有一行两个整数,分别代表宗教数 和房间数 。
输出格式
输出一行一个整数代表答案。
样例 #1
样例输入 #1
2 3
样例输出 #1
6
提示
样例输入输出 1 解释
状态编号 | 1 号房间 | 2 号房间 | 3 号房间 |
---|---|---|---|
1 | 信仰 1 | 信仰 1 | 信仰 1 |
2 | 信仰 1 | 信仰 1 | 信仰 2 |
3 | 信仰 1 | 信仰 2 | 信仰 2 |
4 | 信仰 2 | 信仰 1 | 信仰 1 |
5 | 信仰 2 | 信仰 2 | 信仰 2 |
6 | 信仰 2 | 信仰 2 | 信仰 1 |
数据规模与约定
对于 的数据,保证 ,。
思路
有 n 个房间, 染 m 种色, 要求相邻房间同色的方案数。
易知总方案数为 , 且相邻房间不同色的方案数为 。
则就直接用容斥定理, 最终方案数就是 , 因为有取模, 故有概率会得到负数, 需要 给变成非负数。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MOD = 100003;
int qmi(LL a, LL b, int p)
{
int res = 1;
while(b)
{
if(b & 1) res = (res * a) % p;
a = (a * a) % p;
b >>= 1;
}
return res;
}
void solve() {
LL n,m;
cin >> m >> n;
cout << (qmi(m,n,MOD) - (m * qmi(m-1,n-1,MOD)) % MOD + MOD)% MOD << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}