RQNOJ85 三个袋子 题解、、

该博客详细解析了RQNOJ85题目的解决方案,涉及将不同小球放入三个相同袋子的问题。通过组合数学原理,博主推导出计算方案数的公式,并利用快速幂算法避免数值溢出,最终给出问题的高效求解方法,并附带核心代码。

题目:三个袋子
问题编号:85
题目描述
背景
平平在公园里游玩时捡到了很多小球,而且每个球都不一样。平平找遍了全身只发现了3个一模一样的袋子。他打算把这些小球都装进袋子里(袋子可以为空)。他想知道他总共有多少种放法。
题目描述
将N个不同的球放到3个相同的袋子里,求放球的方案总数M。
结果可能很大,我们仅要求输出M mod K的结果。
现在,平平已经统计出了N<=10的所有情况。见下表:
N 1 2 3 4 5 6 7 8 9 10
M 1 2 5 14 41 122 365 1094 3281 9842
数据规模
对于 40%数据,10<=N<=10,000
对于100%数据,10<=N<=1,000,000,000
对于 100%数据,K<=100,000

输入格式
两个整数N,K,N表示球的个数。

输出格式
输出仅包括一行,一个整数M mod K 。

样例输入
11 10000

样例输出
9525
这道题目考察的内容为组合数学。如果每个袋子不一样,球也不一样,那么总方案数为3^n;

但是现在袋子是一样的。于是需要除以3的全排列即3! 但是在袋子一样的情况下,如果所有的球都装在一个袋子中,另外两个袋子是一样的。于是方案就漏算了。由于有三个袋子,所以方案数要加上3再除以3的全排列。于是方案总数变成了 (3^n+3)/3!

化简一下变成(3^(n-1)+1)/2;输出的答案变成了 (3^(n-1)+1)/2 mod k; 如果直接计算,这个结果会很大。导致数字超出范围。于是需要用到快速幂;但是这个算式中又出现了出发,如果要在快速幂中加入出发,那么程序会很难写,而且还需要用带很多高级的定理,于是我从另一个方向出发。将算式化为 ((3^(n-1)+1) mod (2*k) )div 2,这个式子看起来似乎很复杂,但是用于编程就会变的灰常好用了。这个化简需要用到一个定理:(a d

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值