首页 写随笔

cdcq(本博客废弃!现用博客:https://www.cnblogs.com/cdcq/)

本博客废弃!现用博客:https://www.cnblogs.com/cdcq/

导航

【BZOJ1008】【HNOI2008】越狱

以前水过的水题

原题:

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

1<=M<=10^8,1<=N<=10^12

 

稍用点组合数学的知识即可推出答案,不过我没看出来

用减法原理,有相邻一样的个数是所有个数m^n-没相邻一样的个数
第一个数有m种可能,第二个数要和它不一样就有m-1种可能,第三个数要和第二个数不一样又有m-1种可能,没相邻一样的个数就是m*((m-1)^(n-1))
听说所有的数都要longlong(我看题解了一。一)
需要注意的是不能直接输出答案,要判断如果答案小于零,就要加上取的余数
代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 long long num=100003;
 5 long long n,m;
 6 long long fast_mi(long long x,long long y)
 7 {
 8     long long z=1,base=x;
 9     while(y)
10     {
11         if(y%2)
12         {
13             z=(z*base)%num;
14         }
15         base=(base*base)%num;
16         y>>=1;
17     }
18     return z;
19 }
20 int main()
21 {
22     cin>>m>>n;
23     long long ans=(fast_mi(m,n)-(m*fast_mi(m-1,n-1))%num)%num;
24     while(ans<0)
25     {
26         ans+=num;
27     }
28     cout<<ans<<endl;
29     return 0;
30 }
View Code

 

posted on 2016-09-28 17:17  cdcq_old  阅读(170)  评论(0编辑  收藏  举报