P3197 [HNOI2008]越狱

P3197 [HNOI2008]越狱

题目

题目描述

监狱有 n 个房间,每个房间关押一个犯人,有 m 种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。

答案对 100,003 取模。

输入格式

输入只有一行两个整数,分别代表宗教数 m 和房间数 n

输出格式

输出一行一个整数代表答案。

思路

大致思路:先计算所有犯人的状态,然后减去相邻罪犯宗教不同的数量,即为答案

先计算所有的状态:共有n个房间,每个房间可以有m种选择,故一共为 mn 种选择

不同的状态:相邻两个宗教不同,即如果第一个房间有n个选择,第二个房间就只有n-1中选择

ans=mnm(m1)n1


小tips:为了避免出现奇怪的前者在对p取模后小于后者的情况(事实上从第二个点就会出现这种情况),我们可以在相减后加上一个p再对p取模


CPP

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

inline int read() {
    int x, f = 1;
    char c;
    while (!((c = getchar()) >= '0' && c <= '9')) if (c == '-') f = -1;
    x = c - '0';
    while ((c = getchar()) >= '0' && c <= '9') (x *= 10) += c - '0';
    return x * f;
}

inline void write(int x) {
    if (x < 0) putchar('-'), x = -x;
    if (x > 9) write(x / 10);
    putchar(x % 10 ^ 48);
}

inline int qpow(int a, int k, int p) {
    int res = 1;
    while (k) {
        if (k & 1) res = res * a % p;
        k >>= 1;
        a = a * a % p;
    }
    return res;
}

signed main() {
    m = read(), n = read();
    int ans = ((qpow(m, n, mod) - m % mod * qpow(m - 1, n - 1, mod)) % mod + mod) % mod;
    write(ans); putchar('\n');
    return 0;
}

总结

一道很经典的正难则反问题,代码比较容易实现,要注意取模运算的特殊性

posted @   Pass1on_W  阅读(89)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示