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

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

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

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

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值