版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40924940/article/details/83796237
问题 D: 越狱
时间限制: 1 Sec 内存限制: 128 MB
提交: 34 解决: 12
[提交][状态][讨论版][命题人:quanxing]
题目描述
监狱有连续编号为 1 到 n 的 n 个房间,每个房间关押一个犯人。有 m 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。求有多少种状态可能发生越狱。
输入
输入两个整数 m 和 n。
对于全部数据,1≤m≤108,1≤n≤1012。
输出
可能越狱的状态数,对 100003 取余。
样例输入
2 3
样例输出
6
以上为题目,这题很有意思 需要反向思维,手 n 个囚房 m个信仰 一共有 m^n种情况对吧
如果避免相邻的一直 第一房子 有 m种选择,而相邻的第二个只有 m-1 种 防止重复,而第三个 还是 m-1种
不越狱的情况共有 m*(m-1)^(n-1)
那么越狱情况 一相减就出来了。。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod = 100003;
#define ll long long int
ll pow(ll x,ll n)
{
ll ans=1;
while(n)
{
if(n&1)
{
ans*=x;
ans%=mod;
}
x*=x;
x%=mod;
n>>=1;
}
return ans;
}
ll n,m;
int main()
{
cin>>m>>n;
ll ans=(pow(m,n)%mod+mod-m*pow(m-1,n-1)%mod)%mod;//防止不足mod变成0 先加上一个Mod
cout<<ans<<endl;
return 0;
}