题目描述:
题目链接
监狱有连续编号为 1 到 n 的 n 个房间,每个房间关押一个犯人。
有 m 种宗教,每个犯人可能信仰其中一种。
如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。
求有多少种状态可能发生越狱。
输入格式
共一行,包含两个整数 m 和 n。
输出格式
可能越狱的状态数,对 100003 取余。
数据范围
1≤m≤108,
1≤n≤1012。
思路:
对于有 n 个房间(n个犯人),m个宗教信仰。和高中数学的乘法原理类似!
比如当前,一个房间可以有m个选择,那么n个人,就有mn种选择了,即包括了所有的选法。是一个全集。
而后我们要求的是有多少种相邻的选法,但是这个不好求,我们可将全集划分为:
对于:相邻两个信仰不同的选择:
所以一共有 m*(m-1)(n-1)种选法!
利用容斥原理进行全集 - 不相同集合 = 相邻相同集合!
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod = 100003;
int quick_power(int a, LL k) // 求a^k mod p
{
int res=1;
while (k)
{
if (k&1) res = (LL)res*a % mod;
a = (LL)a*a%mod;
k >>= 1;
}
return res;
}
int main()
{
int m;
LL n;
cin >> m >> n;
cout << (((quick_power(m, n) - (LL)m*quick_power(m-1, n-1))%mod + mod)%mod);
return 0;
}