题解P3197 [HNOI2008]越狱

Author Avatar
Sophon 2月 14, 2020
| keyboard本文共:365字 | query_builder阅读时间≈1分 |
  • 在其它设备中阅读本文章

思路

这道题可以从反面去考虑,即:先计算出不可能发生越狱的状态总数,并用它减去总状态数即为这道题要求的答案。

首先,在不失一般性的情况下,不妨设第一个房间里的犯人的宗教信仰为$p$,则第二个房间里的烦人的宗教信仰不能为$p$,因此第二个房间里的犯人的宗教信仰共有$(m - 1)$种可能性。同理,第三个房间里的犯人的宗教信仰也共有$(m - 1)$种可能性……故第二个到第$n$个房间里的烦人的宗教信仰共有$(n - 1)^{(m - 1)}$种可能性。而第一个房间里的犯人的信仰有$n$种可能,故不可能发生越狱的状态总数为
$$n×(n - 1)^{(m - 1)}$$

那么,总状态数是多少呢?容易求的总状态数为$n^m$,所以题目所求为
$$n^m-n×(n - 1)^{(m - 1)}$$

这道题还有一个要注意的地方:$m$最大为$10^8$,因此要用快速幂来计算

AC代码:

#include<iostream>
using namespace std;

const long long MOD = 100003;

long long power(long long b, long long p) {
    if(p == 0) {
        return 1;
    }
    long long ans = power(b, p / 2);
    ans = ans * ans % MOD;
    if(p % 2 == 1) {
        ans = ans * b % MOD;
    }
    return ans;
}

int main() {
    long long m, n;

    cin >> m >> n;
    long long ans = ((power(m, n) - m * power(m - 1, n - 1)) % MOD + MOD) % MOD;
    cout << ans << endl;

    return 0;
}

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载请注明出处!
本文链接:https://keepthethink.github.io/archives/4021524966/