P3197 [HNOI2008]越狱(反向思维)
题目描述:
监狱有 n 个房间,每个房间关押一个犯人,有 m 种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
答案对 100,003 取模。
思路:如果直接算有多少种可能的状态发生越狱就很麻烦,可能的情况有,两个相邻的位置宗教相同,三个,四个,两个两个相同但是中间隔了一个不同....
然后求和之后还要用容斥原理来减去多余的,这咋算嘛,但是如果我们反过来看,我们用所有情况数-排列不相同的情况数,不就得到了排列有相同的可能
情况数了嘛^-^.
AC代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 10000005; const ll inf = 0x3f3f3f3f; const ll mod = 100003; ll n, m; ll qpow(ll a, ll n, ll p) { ll res = 1; while (n) { if (n & 1) { res = (res * a) % p; } n >>= 1; a = (a * a) % p; } return res; } int main() { //freopen("test.txt", "r", stdin); scanf("%lld%lld", &m, &n); ll sum = qpow(m, n, mod); ll res = qpow(m-1, n - 1, mod) * m % mod; cout << (sum + mod - res) % mod << endl; return 0; }