若没了解过快速幂,请移至第数论第一篇题解 快速幂模板
题目描述
监狱有连续编号为 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;
}
关注点一点,活到九十九!!!谢谢啦!!!
网友评论