BZOJ 1008 [HNOI2008]越狱

1008: [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)

 


 

  很是有趣。组合数学,本人是数学蒟蒻,看了题解后才明白。其实关键就是逆向思维。n个房间 m种宗教,总状态数即m^n,若不越狱,即相邻房间的两个人宗教不同,所以第一个人有m种选择,则后面的每一个人都有m-1种选择,所以不越狱的状态总数我m*(m-1)^(n-1);所以越狱的状态数就为m^n-m*(m-1)^(n-1)。解决了这个问题后,快速幂解决就好了。注意:要用long long。

 1 /**************************************************************
 2     Problem: 1008
 3     User: Doggu
 4     Language: C++
 5     Result: Accepted
 6     Time:16 ms
 7     Memory:820 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 const long long MOD = 100003;
12 long long n, m;
13 long long mpow(long long a,long long b,long long MOD) {
14     long long res = 1;
15     for(;b;b>>=1,a=a*a%MOD) if(b&1) res=res*a%MOD;
16     return res;
17 }
18 int main() {
19     scanf("%lld%lld",&m,&n);
20     printf( "%lld", ((mpow(m,n,MOD)-m*mpow(m-1,n-1,MOD))%MOD+MOD)%MOD );
21     return 0;
22 }
23 
组合数学

 

posted @ 2017-05-26 16:56 Doggu 阅读(...) 评论(...) 编辑 收藏