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 }
View Code

 

posted @ 2017-10-08 07:54  I__am  阅读(63)  评论(0编辑  收藏