回档|分苹果
背景:今晚在tyvj参加了一下比赛,没想到可耻的跪了。第一题地球人都知道spfa,结果我写了个坐标类DP还得了30分……悲剧。唯一欣慰的是我用组合数学做出了第二题,奠定了我们学校有五个人冲进前六的基础。先发第二题好了。
题目:由于tyvj比较坑,比赛的题目竟然没了!只能说下大体意思。给定n个苹果,要求分到3个袋子中。袋子是无序的,问有多少种情况,并对k取模。
输入解释:第一行,输入两个整数n,k
输出解释:输出只有一行,即方案总数对k取模的结果。
输入样例: 11 10000
输出样例: 9525
题目分析:
很明显,每个苹果有三种可能,即放在1,2,3号袋子中。于是n个苹果的总数就是3^n。
我们不妨利用容斥原理对所有情况进行分类讨论:
(1)当有两个袋子为0时。那么就会有0,0,全部;0,全部,0;全部,0,0三种情况。显然这应算是一种情况。之所以算是三种而不是六种(见下),是 因为当我们把全部苹果放入一个袋子时,显然与放置一个苹果是等价的。那么对于一个苹果,无疑只有一种情况。
(2)对于剩余情况,我们不妨把三个袋子按苹果多少排序。例如1,2,3。显然这组数字有六种不同的顺序。也就是我们说得普通情况。
因此我们可以得到公式:ans=(3^n-3)/6+1。事实上运用除法逆元还可以进一步简化,请同学们自行思考。(解释都到这里了,源代码就不用发了吧?事实上是代码被tyvj吞了……)