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)

Source


 题解
    越狱的情况直接求的话不太好求,不能越狱的情况只需要相邻两个房间的信仰不同即可,再用总的信仰减去就可以了。直接乘法原理+快速幂做一下,方案数为$m^{n}-m*(m-1)^{n-1}$.
    

```
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 const int mod=100003;
 6 long long quick_pow(long long a,long long b,int mod)
 7 {
 8     long long ans=1;
 9     while(b!=0)
10     {
11         if(b%2==1) ans=ans*a%mod;
12         a=a*a%mod;
13         b/=2;
14     }
15     return ans;
16 }
17 int main(int argc, char *argv[])
18 {
19     long long n,m,ans=0;
20     scanf("%lld%lld",&m,&n);
21     ans+=quick_pow(m,n,mod);
22     ans-=quick_pow(m-1,n-1,mod)*m%mod;
23     printf("%d\n",(ans+mod)%mod);
24     return 0;
25 }

 

posted @ 2016-09-02 08:37  BeyondW  阅读(103)  评论(0编辑  收藏