Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js

AcWing 1290. 越狱  

AcWingAcWing 12901290. 越狱

一、题目描述

监狱有连续编号为 11nnnn 个房间,每个房间关押一个犯人。

mm 种宗教,每个犯人可能信仰其中一种。

如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。

求有多少种状态可能发生越狱。

输入格式
共一行,包含两个整数 mmnn

输出格式
可能越狱的状态数,对 100003100003 取余。

数据范围
1m1081m108
1n10121n1012

输入样例

2 3

输出样例

6

样例解释
所有可能的 66 种状态为:(000)(001)(011)(100)(110)(111)(000)(001)(011)(100)(110)(111)

二、解题思路

本题可以采用容斥原理补集的思想。

考虑 nn 个犯人,mm种宗教,如何安排不会导致犯罪。

第一个位置可以有 mm 个选择,则与第一个相邻的第二个位置就只有 m1m1 中选择。

考虑第 ii 个位置,则为了不和他左侧的 i1i1 位置发生冲突,一共有 m1m1 种选择。

因此不会导致犯罪的方案是: m(m1)n1m(m1)n1

则会导致犯罪的方案是:mnm(m1)n1mnm(m1)n1

计算一个数字的nn次方,还要求取模,自然就需要使用快速幂~

注意
注意减法取模可能会变成负数,那么我们要把他转化正数 (ab+mod)%mod(ab+mod)%mod 即可

这里解释下:为什么取模+减法会出现负数呢?比如MOD=10MOD=10
a=13,b=5a=13,b=5
$ (a%MOD -b % MOD) % MOD=13%10 - 5 %10=3-5=-2MOD$就行了

三、实现代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 100003;

int qmi(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1) res = res * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return res;
}

signed main() {
    int m, n;
    cin >> m >> n;
    cout << (qmi(m, n) - m * qmi(m - 1, n - 1) % MOD + MOD) % MOD << endl;
    return 0;
}
posted @   糖豆爸爸  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 欧阳的2024年终总结,迷茫,重生与失业
· 聊一聊 C#异步 任务延续的三种底层玩法
· 上位机能不能替代PLC呢?
· 2024年终总结:5000 Star,10w 下载量,这是我交出的开源答卷
· .NET Core:架构、特性和优势详解
Live2D
点击右上角即可分享
微信分享提示