【题解】越狱

题目描述

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

输入输出格式

输入格式:

输入两个整数m和n。

输出格式:

可能越狱的状态数,对100003取余。

输入输出样例

输入样例:

2 3

输出样例:

6

说明

样例说明:

所有可能的6种状态为:{0,0,0},{0,0,1},{0,1,1},{1,0,0},{1,1,0},{1,1,1}。

数据规模:

对于100%的数据,1≤m≤\(10^8\),1≤n≤\(10^{12}\)

解题方法

求可能越狱的方案数,发现方案数太多,不好算
于是我们可以先求出不能越狱的方案数,再用总方案数减去不可越狱方案数即可
因为只有相邻的信仰不相同才不能越狱,所以如果第一个房间有m种选择,第二个房间只有m-1种选择,第三个房间也只有m-1种选择,以此类推
所以得出公式
\(不可越狱方案数=m\times(m-1)^{n-1}\)
(注意用快速幂,并记得取模)

#include<iostream>
using namespace std;
long long n,m;
long long pow(long long a,long long b)
{
	long long ans=1,base=a%100003;
	while(b!=0)
	{
		if(b&1!=0) ans=(ans*base)%100003;
		base=(base*base)%100003;
		b>>=1;
	}
	return ans;
}
int main()
{
	cin>>m>>n;
	if(pow(m,n)%100003-(m*pow(m-1,n-1))%100003>0) cout<<pow(m,n)%100003-(m*pow(m-1,n-1))%100003;
	else cout<<pow(m,n)%100003-(m*pow(m-1,n-1))%100003+100003;
}

注意

最后可能出现负数结果,如果出现负数,则说明总方案数再取模时变小了,而不可越狱方案数取模后可能变得比总方案数大
例如:
当总方案数为6,不可越狱方案数为2,取模为5时
总方案数取模后为1,不可越狱方案数取模后为2,相减会得到负数
此时只需要将结果加上取模的值就可以得到正确结果

posted @ 2020-05-14 13:34  X_OR  阅读(450)  评论(0编辑  收藏  举报