[BZOJ 1008] [HNOI 2008] 越狱

1008: [HNOI2008]越狱

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 5041  Solved: 2177
[Submit][Status][Discuss]

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)

【题解】

这题是BZOJ中我唯一认为水的题目!

除了A+B Problem

减法原理,首先一共有n^m种可能,设n个房间满足的情况数为An,那么An=(m-1)An-1,且A1=m

所以答案就出来了:mn-m(m-1)n-1

用快速幂做,最后要提醒注意,减法可能会减出负数,这是要加上MOD

代码如下

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 
 4 using namespace std;
 5 const int MOD=100003;
 6 int power(int a,int b) {
 7     if (b==0) return 1;
 8     if (b==1) return a%MOD;
 9     int q=power(a,b/2)%MOD;
10     if (b&1) return q*q%MOD*a%MOD;
11     else return q*q%MOD;
12 }
13 main() {
14     //m^n-m*(m-1)^(n-1)
15     int m,n,ans;
16     scanf("%lld%lld",&m,&n);
17     ans=(power(m,n)%MOD-m%MOD*power(m-1,n-1)%MOD)%MOD;
18     printf("%lld\n",ans<0?ans+MOD:ans);
19     return 0;
20 }
View Code

 

posted @ 2015-05-27 07:10  TonyFang  阅读(95)  评论(0编辑  收藏