洛谷P3197 [HNOI2008] 越狱 题解

正难则反。

发现越狱的状态数量不好求,那我们只需要拿总状态数量减去不越狱的状态数量就是越狱的状态数量。

简单说明一下,总状态数就是 \(m^n\),不越狱的状态数就是 \(m \times (m-1)^{n-1}\),因为第一个人有 \(m\) 种宗教可以选择,后面的人为了不和上一个人选的宗教重复,只有 \(m-1\) 中选择。

十年 OI 一场空,不开 long long 见祖宗!

三年 OI 一场空,取模不对见祖宗!

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e5+3; 
signed main()
{
	int n,m;
	scanf("%lld %lld",&m,&n);
	int ans = 1,a = m,b = n;
	while(b)
	{
		if(b&1)
		{
			ans = ans*a%mod;
		}
		a = a*a%mod;
		b>>=1;
	}
	int cnt = m%mod;
	a = m-1,b = n-1;
	while(b)
	{
		if(b&1)
		{
			cnt = cnt*a%mod;
		}
		a = a*a%mod;
		b>>=1;
	}
	printf("%d",(ans-cnt+mod)%mod);//注意是减法的取模,所以得先+mod再%mod
	return 0;
}
posted @ 2025-03-20 11:38  林晋堃  阅读(90)  评论(0)    收藏  举报