随笔 - 106  文章 - 0  评论 - 2 

BZOJ1008 [HNOI2008]越狱 【数学】

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)

 

题解:

一开始以为组合数学,后来想想要用逆向思维。

求越狱状态我们可以用总状态数 - 非越狱状态。(似不似很巧妙啊,逃~)

总状态数位 m^n,非越狱状态:第一个人有 m 种宗教可选,接下来每一个都与前面不同,都各有 m-1 种选择,总共就 m*(m-1)^(n-1) 种非越狱状态。

答案就是 m^n-m*(m-1)^(n-1)。快速幂搬上来了哦。。

 

代码:

 

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int MO=100003;
 5 ll n,m;
 6 ll ksm(ll x,ll y)
 7 {
 8     ll a=1; x%=MO;
 9     while (y>0)
10     {
11         if (y & 1) a=(a*x) % MO;
12         y>>=1;
13         x=(x*x) % MO;
14     }
15     return a;
16 }
17 int main()
18 {
19     scanf("%lld%lld",&m,&n);
20     ll ans=ksm(m,n);
21     ans=ans-(m*ksm(m-1,n-1))%MO;
22     if (ans<0) ans+=MO;
23     cout<<ans<<endl;
24     return 0;
25 }
View Code

 

 

 

加油加油加油!!! fighting fighting fighting !!!

 

 

posted on 2018-06-26 09:29  Frank-King  阅读(67)  评论(0编辑  收藏