首页 > 代码库 > BZOJ1008: [HNOI2008]越狱 快速幂

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 }

 

BZOJ1008: [HNOI2008]越狱 快速幂