【题解】越狱
题目描述
监狱有连续编号为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,相减会得到负数
此时只需要将结果加上取模的值就可以得到正确结果