题意描述
监狱有连续编号为 的 个房间,每个房间关押一个犯人。
一共有 种宗教,每个犯人可能信仰其中一种。
如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
输入格式
输入仅有一行,包括两个整数 ,分别表示宗教数量与犯人数量。
输出格式
输出仅有一行,包含一个整数,表示可能越狱的状态数。
由于这个数可能比较大,因此,请输出该数模 取余的结果。
Output ‘s eg
样例解释
6 种状态为 ,,,,,
数据范围和约定
对于 的数据,保证
对于 的数据,保证 ,
分析
真正的组合数学入门题……
尝试直接做,发现直接统计多少人越狱会很麻烦。
考虑容斥。很容易看出,越狱的方案数等于总共的方案数减去不会越狱的方案数。
由于每一个房间信仰的宗教有 种可能,一共有 个房间,因此,总方案数为 。
现在考虑怎么样才不会越狱,显然,只有当两个房间信仰的宗教不同时才不会越狱。
也就是说,对于第一个房间,我们有 种选择,而剩下的房间要保证与之前的房间不同,每一间都有 种可能。
综上,最终答案为 ,直接快速幂计算即可。
剩下的见代码即可 (这题应该不用写注释了吧)
Code[Accepted]
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<stack> #include<queue> #include<deque> #include<vector> #include<algorithm> #include<iomanip> #include<cstdlib> #include<cctype> #include<cmath>
#define ll long long #define I inline #define N 100001 #define HA 100003
using namespace std;
ll n , m;
ll Pow(ll a , ll n){ if(n == 0) return 1; if(n == 1) return a; ll c = Pow(a , n >> 1) % HA; if(n % 2 == 0){ return c * c % HA; } else{ return ((c * c) % HA * a) % HA; } }
int main(){ cin >> m >> n; ll ans = Pow(m , n) - m * Pow(m - 1 , n - 1) % HA; ans += HA; cout << ans % HA << "\n"; return 0; }
|
THE END