BZOJ-1008-[HNOI2008]越狱(快速幂)
Posted I__am
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ-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)
题解
这道题要我们求越狱的状态数,但是我们直接求有些困难,可以求出哪些不是越狱的状态,再用总状态数减去就可以了
那么不是越狱的状态有多少种呢?
就是第一个人可以有m种宗教信仰,第二个人有m-1种,第三个人也有m-1种,......,这样就有m*(m-1)^(n-1)种方案
而总方案数是m^n,所以越狱的状态就有m^n-m*(m-1)^(n-1)种
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define mod 100003 4 using namespace std; 5 ll n,m,x; 6 ll pow_mul(ll a,ll b){ 7 ll tmp=a,ans=1ll; 8 while (b>0){ 9 if (b%2) ans=ans*tmp%mod; 10 tmp=tmp*tmp%mod; 11 b>>=1; 12 } 13 return ans; 14 } 15 int main(){ 16 scanf("%lld%lld",&m,&n); 17 x=pow_mul(m,n)-m*pow_mul(m-1,n-1); 18 x=(x%mod+mod)%mod; 19 printf("%lld\n",x); 20 return 0; 21 }
以上是关于BZOJ-1008-[HNOI2008]越狱(快速幂)的主要内容,如果未能解决你的问题,请参考以下文章