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 }
叶子的离去,是风的追求,还是树的不挽留?