首页 > 其他 > 详细

HNOI 2008越狱(组合数学(乘法原理)+快速幂)

时间:2020-04-17 12:46:47      阅读:68      评论:0      收藏:0      [点我收藏+]

HNOI 2008越狱

技术分享图片

Input

技术分享图片

output

技术分享图片

Example

技术分享图片

Hint

技术分享图片

 

本题要是没有点数学知识还真不太好做。首先我们想相邻的有都少种,但是这样想很明显太复杂了,可以想反面,如果算出不相邻的,用总数减去不相邻的就可以了。

总数由乘法原理可知是mn,(乘法原理,第一个位置有m种选择,第二个位置也是m种,依次类推,总共m*m*......m种,有几个位置就乘以几个m),

那题目的反面就是第一个位置有m种可能,第二个位置要和它不一样就有m-1种可能,第三个位置要和第二个位置不一样又有m-1种可能,这样题目反面(没相邻一样)的个数就是m*((m-1)(n-1))种。

用总数减去题目反面即可。

注意本题有可能最后为负数,要保证是正数。数据较大,用快速幂。

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 typedef long long ll;
 5 const int mod=100003;
 6 ll fpow(ll x,ll y)//快速幂 
 7 {
 8     ll res=1;
 9     while(y)
10     {
11         if(y&1)
12         {
13             res=res*x%mod;
14         }
15         x=x*x%mod;
16         y>>=1;
17     }
18     return res%mod;
19 }
20 int main()
21 {
22     ll n,m;
23     cin>>m>>n;
24     ll ans;
25     ans=(fpow(m,n)-m*fpow((m-1),(n-1)))%mod;
26     if(ans<0)//可能为负 
27     {
28         ans+=mod;
29         ans%=mod;
30     }
31     cout<<ans;
32     return 0;
33 }

 

HNOI 2008越狱(组合数学(乘法原理)+快速幂)

原文:https://www.cnblogs.com/theshorekind/p/12718504.html

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