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;
}

 

posted @ 2021-05-05 11:05  cono奇犽哒  阅读(53)  评论(0编辑  收藏  举报