bzoj1008[HNOI2008]越狱

传送门

Description

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

Input

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

Output

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

Sample Input

2 3

Sample Output

6

HINT

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

题解:

我们可以从逆向思考,对于每一种宗教,它的下一个位置有m-1种选择,因此不会越狱的情况有m*(m-1)^(n-1)种,总情况有m^n种,因此会越狱有m^n-m*(m-1)^(n-1)种,用快速幂即可求出答案。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #define ll long long
 8 #define mo 100003
 9 using namespace std;
10 ll m,n,ans;
11 ll qui(ll x,ll t){
12     ll a=1;x=x%mo;
13     while(t){
14         if(t&1)  a=a*x%mo;
15         x=x*x%mo;
16         t>>=1;
17     }
18     return a;
19 }
20 int main(){
21     scanf("%lld%lld",&m,&n);
22     ans=qui(m,n);
23     ll k=m*qui(m-1,n-1)%mo;
24     ans-=k;
25     while(ans<0)  ans+=mo;
26     ans%=mo;
27     printf("%lld\n",ans);
28     return 0;
29 }

 

posted @ 2018-02-27 13:08  lazytear  阅读(45)  评论(0编辑  收藏