[HNOI2008]越狱

题目描述

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

输入格式

输入两个整数m,n

输出格式

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

输入输出样例

输入 #1
2 3
输出 #1
6

说明/提示

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

【解题思路】

随便选宗教,方案数m^n

不会发生越狱的情况,第一个人选种宗教,后面个人都能选(m−1)种宗教,方案数为m∗(m−1)^(n−1)

减一减答案等于差,正难则反

快速幂搞一搞即可,注意longlong

【code】

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 long long m,n,ans;
 5 const int mod=100003; 
 6 inline long long ksm(long long a,long long b){
 7     ans=1;
 8     while(b){
 9         if(b&1)
10             ans=ans*a%mod;
11         a=a*a%mod;
12         b>>=1;
13     }
14     return ans;
15 }
16 int main(){
17     scanf("%lld%lld",&m,&n);
18     printf("%lld\n",(ksm(m,n)-m*ksm(m-1,n-1)%mod+mod)%mod);
19     return 0;
20 }

 

posted @ 2019-09-07 15:04  GTR_PaulFrank  阅读(154)  评论(0编辑  收藏  举报