[BZOJ 1008] [HNOI 2008] 越狱
1008: [HNOI2008]越狱
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 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 }
这篇文章由TonyFang发布。
所有解释权归TonyFang所有。
Mailto: tony-fang@map-le.net