BZOJ 1008: [HNOI2008]越狱 - 组合数学

本文探讨了在一个连续编号的监狱房间中,不同宗教信仰的犯人如何安排才能避免相邻房间信仰相同从而导致越狱风险的问题。通过组合数学的方法,计算了在给定房间数和宗教种类的情况下,可能发生越狱的状态数量。

监狱有连续编号为1…N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱

直接计算产生相邻的情况相当复杂,但发生相邻的情况数量等于总数量减去不相邻数量。不相邻数量可以按照如下方法构造:

第一个人有 mm 种可能,要不产生相邻则第二个人只有 m1 种选择,第三个人也是,以此类推,总数为:m(m1)(n1)m(m−1)(n−1)。而总的排列数量为:nmnm

#ifdef LOCAL
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#else
#include <bits/stdc++.h>
#endif
#define INF 0x7FFFFFFF
using namespace std;
typedef long long LL;
inline void read(LL&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
namespace QuickPower {
const LL MOD = 100003;
inline LL pow(const LL x, const LL n) {
    LL ans = 1;
    for (LL num = x % MOD, k = n; k; num = num * num % MOD, k >>= 1) if (k & 1) ans = ans * num % MOD;
    return ans;
}
}
int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
#endif
    LL M, N;
    while (~scanf("%lld%lld", &M, &N)) {
        LL ans = QuickPower::pow(M, N) - QuickPower::pow(M-1, N-1)*M;
        printf("%lld\n", (ans%QuickPower::MOD+QuickPower::MOD)%QuickPower::MOD);
    }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值