[HNOI2008]越狱
题目描述
监狱有连续编号为 1…N的 N个房间,每个房间关押一个犯人,有 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 }