BZOJ 1008 [HNOI2008] 越狱(简单组合数学)

 

题目大意

 

监狱有连续编号为 1...N 的 N 个房间,每个房间关押一个犯人,有 M 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。

 

Input

  输入两个整数 M,N。1<=M<=10^8,1<=N<=10^12

Output

  可能越狱的状态数,模 100003 取余

 

 

做法分析

 

简单组合数学:所有的可能宗教信仰方案为:M^N

不可能越狱(相邻两个房间的人的宗教信仰不同)的方案为:M*(M-1)^(N-1)

于是最终的答案: [M^N-M*(M-1)^(N-1)]%100003

 

参考代码

 

BZOJ 1008 [HNOI2008] 越狱(简单组合数学)
 1 #include <iostream>

 2 #include <cstring>

 3 #include <cstdio>

 4 

 5 using namespace std;

 6 

 7 typedef long long LL;

 8 const LL MOD=100003;

 9 

10 LL pow(LL n, LL p) {

11     LL ans=1;

12     while(p) {

13         if(p&1) ans=ans*n%MOD;

14         n=n*n%MOD;

15         p>>=1;

16     }

17     return ans;

18 }

19 

20 void read(LL &x) {

21     char c;

22     while((c=getchar())<'0' || c>'9');

23     x=c-'0';

24     while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+c-'0';

25 }

26 

27 int main() {

28     LL n, m;

29     read(m), read(n);

30     LL ans=pow(m, n);

31     ans=(ans+MOD-m*pow(m-1, n-1)%MOD)%MOD;

32     printf("%lld\n", ans);

33     return 0;

34 }
BZOJ 1008

 

题目链接 & AC 通道

 

BZOJ 1008 [HNOI2008] 越狱

 

 

 

 

你可能感兴趣的:(2008)