P3197 [HNOI2008]越狱
P3197 [HNOI2008]越狱
题目
题目描述
监狱有 n 个房间,每个房间关押一个犯人,有 m 种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
答案对 100,003 取模。
输入格式
输入只有一行两个整数,分别代表宗教数 m 和房间数 n。
输出格式
输出一行一个整数代表答案。
思路
大致思路:先计算所有犯人的状态,然后减去相邻罪犯宗教不同的数量,即为答案
先计算所有的状态:共有n个房间,每个房间可以有m种选择,故一共为
不同的状态:相邻两个宗教不同,即如果第一个房间有n个选择,第二个房间就只有n-1中选择
小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;
}
总结
一道很经典的正难则反问题,代码比较容易实现,要注意取模运算的特殊性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】