(快速幂) luogu P3197 [HNOI2008]越狱

快速幂解决越狱状态计数
本文介绍了一种利用快速幂算法解决越狱状态计数问题的方法。在一个连续编号的监狱中,每个房间关押的犯人可能信仰M种宗教之一,目标是计算在相邻房间犯人宗教相同即可能发生越狱的情况下,共有多少种可能发生越狱的状态。通过计算总的方案数和不可能发生越狱的方案数,相减得到可能越狱的状态数。

若没了解过快速幂,请移至第数论第一篇题解 快速幂模板

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

输入输出格式
输入格式:
输入两个整数 M,N
输出格式:
可能越狱的状态数,模 100003 取余

直接计算可能越狱的情况数很困难,所以我们转换思路,先求出所有的情况,再求出不可能的情况,相减即是可能的情况。。

有n个监狱,m种选择,总方案数便是mn,第一间监狱有m种方案,第二件因为不能和第一间一样则第二间的方案数为m-1,第三件不能和第二间一样,则也有m-1种,以此类推,故不可能的情况数为m(m-1)(n-1);

故答案为mn-m(m-1)(n-1);

该快速幂上场表演了!!

代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define LL long long
#include<algorithm>
using namespace std;
LL n,m,mod=100003;
LL quickPow(LL a,LL b){
	LL sum=1;
	while(b){
		if(b&1) sum=sum*a%mod;
		b>>=1;
		a=a*a%mod;
	}
	return sum;
}
int main(){
	scanf("%lld%lld",&m,&n);
	LL ans1=quickPow(m,n),ans2=(m%mod*quickPow(m-1,n-1))%mod;
	LL ans=ans1-ans2;
	if(ans<0) ans+=mod;
	printf("%lld\n",ans%mod);
	return 0;
}

关注点一点,活到九十九!!!谢谢啦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值