越狱【快速幂】

越狱

题目链接(点击)

题目描述

监狱有连续编号为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
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;
}
 

 

你可能感兴趣的:(ACM-ICPC)