【BZOJ1008】【HNOI2008】越狱

本文介绍了一个关于计算越狱风险的问题,通过使用组合数学原理解决一个编程挑战。问题设定在一个拥有N个连续编号房间的监狱中,每个房间关押一名犯人,犯人可能信仰M种不同的宗教之一。当相邻房间的犯人信仰相同的宗教时,则可能发生越狱。文章提供了计算可能越狱状态数量的C++代码实现。

以前水过的水题

原题:

 监狱有连续编号为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

 

转载于:https://www.cnblogs.com/JSL2018/p/5917199.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值