洛谷P3197 [HNOI2008]越狱

P3197 [HNOI2008]越狱

题目描述

监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱

输入输出格式

输入格式:

 

输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

 

输出格式:

 

可能越狱的状态数,模100003取余

 

输入输出样例

输入样例#1:
2 3
输出样例#1:
6

说明

6种状态为(000)(001)(011)(100)(110)(111)

1.所有方案数有:mn=m*m(n-1)种;

2.所有不发生越狱的方案数为:m*(m-1)^(n-1)种;

3.所以,发生越狱的方案数为:m*m(n-1)-m*(m-1)(n-1) =m*(m(n-1)-(m-1)(n-1) )

4.分别对m(n-1)和(m-1)(n-1)快速幂即可。

#include<iostream>
#include<cstdio>
#define mod 100003
using namespace std;
long long n,m;
int Pow(long long a,long long b){
    long long res=1;
    while(b){
        if(b&1)res=(res*a)%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int main(){
    cin>>m>>n;
    int ans=(m*(Pow(m,n-1)-Pow(m-1,n-1)+mod)%mod);
    cout<<ans;
}

 

posted @ 2017-09-22 16:20  Echo宝贝儿  阅读(126)  评论(0编辑  收藏  举报