越狱【快速幂】
越狱
题目链接(点击)
题目描述
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
输入
输入两个整数M,N.1<=M<=10^8,1<=N<=10^12
输出
可能越狱的状态数,模100003取余
样例输入
2 3
样例输出
6
提示
6种状态为(000)(001)(011)(100)(110)(111)
思路:
知道总的数目是 m ^n
有两种思路:
要么分开判断2 、3、4…… 相连的有几个 但实在是太麻烦
第二种方法就是:
出现相邻总数目=所有可能 - 任意两个都不是相邻的情况
公式:
sum=m^n - m(m-1)^(n-1)
例如: 有3种宗教(m) 4间房间(n)
—— —— —— —— ( 每个横线表示一个空格)
3 2 2 2 (数字表示在前面房间放入宗教后 在该房间可以放入的宗教总数)
其中 m^n: 表示所有情况 3^4
所以 m*(m-1)^(n-1) 就表示任意两个都不相邻的总情况数
AC代码:
#include<stdio.h>
const int mod=100003;
typedef long long LL;
LL qpow(LL m,LL q)
{
LL ans=1;
while(q){
if(q%2){
ans=ans*m%mod;
}
m=m*m%mod;
q/=2;
}
return ans%mod;
}
int main()
{
LL m,n;
scanf("%lld%lld",&m,&n);
LL num1=qpow(m,n);
LL num2=qpow(m-1,n-1);
LL sum=(num1-((m%mod)*(num2%mod))%mod)%mod;
if(sum<0){
sum+=mod;
}
printf("%lld\n",sum);
return 0;
}