码迷,mamicode.com
首页 > 其他好文 > 详细

P3197 [HNOI2008]越狱

时间:2018-02-24 21:56:47      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:pos   存在   lld   str   log   post   while   多少   inline   

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1: 
2 3
输出样例#1: 
6

说明

6种状态为(000)(001)(011)(100)(110)(111)

 

Solution:

考虑到直接计算存在越狱情况很复杂(不要问为什么),而总的排列数为mn,于是想到用间接法。即会越狱的方案数=总的排列数-不会越狱的方案数。

而求不会越狱的方案数时,第一个位置有m种可能,而后面的n-1个位置都有m-1种可能(即必须满足同种宗教不相邻),由乘法原理得:不会越狱的方案数=m*(m-1)n-1

那么就得出答案:ans=mn-m*(m-1)n-1

代码:

 

 1 // luogu-judger-enable-o2
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 using namespace std;
 5 ll n,m,ans,t;
 6 const int mod=100003;
 7 inline ll fast(ll x,ll k)
 8 {
 9     ll ans=1;
10     while(k){
11         if(k&1)ans=ans*x%mod;
12         k>>=1,x=x*x%mod;
13     }
14     return ans;
15 }
16 int main()
17 {
18     cin>>m>>n;
19     printf("%lld",(mod+fast(m,n)-m*fast(m-1,n-1)%mod)%mod)    ;
20     return 0;
21 }

 

 

 

P3197 [HNOI2008]越狱

标签:pos   存在   lld   str   log   post   while   多少   inline   

原文地址:https://www.cnblogs.com/five20/p/8467543.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!