组合数 容斥原理 T2

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