首页 > 其他 > 详细

P3197 [HNOI2008]越狱(快速幂)

时间:2019-01-19 21:01:21      阅读:162      评论:0      收藏:0      [点我收藏+]

题目描述

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

输入输出格式

输入格式:

输入两个整数 M,NM,NM,N

输出格式:

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

输入输出样例

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

说明

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

1≤M≤ 10^8
1≤N≤10^12



思路:

思考总数 - 合法的状态数(即邻房间的犯人的宗教不相同);

因为每个牢房的犯人都可以信仰 m 种 宗教,所以说一共有 mnmn 种组合。

当一个牢房的犯人信仰一种宗教后,相邻的牢房的犯人只可以信仰 剩下的 m-1种 中的一种才不会越狱,即:

技术分享图片

所以说 这是 m?(m?1)n?1m?(m?1)n?1 种;

所以说答案就是 mn?m?(m?1)n?1mn?m?(m?1)n?1

因为我们在过程中mod过,减出来可能为负,我们需要 (ans + mod)%mod

 




 1 #include"bits/stdc++.h"
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 ll n,m;
 6 const ll mod = 100003;
 7 
 8 ll powmod(ll a,ll b)
 9 {
10    ll base = a%mod;
11    ll ans  = 1;
12 
13    while (b)
14    {
15      if (b&1) ans=ans*base%mod;
16  //  cout<<b<<" "<<base<<endl;
17       b>>=1;
18       base=base*base%mod;
19 
20 
21 
22    }
23 
24   return ans;
25 }
26 
27 
28 
29 
30 
31 int main()
32 {
33    //cout<<powmod(2,4);
34 
35    cin>>m>>n;
36 
37    cout<<(powmod(m,n) -( m*powmod(m-1,n-1))%mod+mod)%100003;
38 
39 }

 




 

 


 

 

 

 

P3197 [HNOI2008]越狱(快速幂)

原文:https://www.cnblogs.com/zhangbuang/p/10292968.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!