P5520 [yLOI2019] 青原樱(排列组合)
P5520 [yLOI2019] 青原櫻
我又來頹文化啦!
題目描述
從 n n n個空位中選擇一些空位種 m m m櫻花,要求每兩棵櫻花之間至少要有一個空位.
求合法種植數.
題目分析
題解本家
這不是五三水題嘛。。。
首先,看到這種“一個空位”的問題,第一想法就是把一棵櫻花和它后面的空位視為一組(或者一個數).
另外我們可以發現,如果最后一個元素在n位置上時,那么是不用考慮它后面的那個空位的.
所以思路就出來了:分類討論.
第一,如果最后一個元素不在 n n n位置上,那么此時相當于有 n ? m n-m n?m個空位,要插入 m m m個元素,再加上這 m m m個元素自身的排列,總共有 A m m C n ? m m A_{m}^{m}C_{n-m}^{m} Amm?Cn?mm?種合法方案.
第二,如果最后一個元素在 n n n位置上,那么此時相當于有 ( n ? 1 ) ? ( m ? 1 ) = n ? m (n-1)-(m-1)=n-m (n?1)?(m?1)=n?m個空位,要插入 m ? 1 m-1 m?1個元素,同樣加上他們自身的排列,總共有 A m m C n ? m m ? 1 A_{m}^{m}C_{n-m}^{m-1} Amm?Cn?mm?1?種方案.
另外, A m m C n ? m m ? 1 = m ? A n ? m m ? 1 A_{m}^{m}C_{n-m}^{m-1}=m*A_{n-m}^{m-1} Amm?Cn?mm?1?=m?An?mm?1?, A m m C n ? m m = A n ? m m A_{m}^{m}C_{n-m}^{m}=A_{n-m}^{m} Amm?Cn?mm?=An?mm?,我們直接處理排列數即可.
求和,而我們知道 A x y + y ? A x y ? 1 = A x + 1 y A_{x}^{y}+y*A_{x}^{y-1}=A_{x+1}^{y} Axy?+y?Axy?1?=Ax+1y?,這樣就可以一遍用 O ( n ) O(n) O(n)求得最后的值.
問我算法?不就是某位老師在視頻里說的嗎?從中間某位開始算啊!
#include<bits/stdc++.h> #define ll long long//防止計算時溢出 using namespace std; ll type,n,m,mod,ans=1; int main(){scanf("%lld%lld%lld%lld",&type,&n,&m,&mod);for(ll i=n-2*m+2;i<=n-m+1;i++){ans=(ans*i)%mod;}printf("%lld\n",ans);return 0; }題后反思
盡量把組合數化簡到最簡的形式,最好是一遍 O ( n ) O(n) O(n)就可以算出來的一維組合數/排列數形式.
注意利用各個公式進行靈活的轉換.
總結
以上是生活随笔為你收集整理的P5520 [yLOI2019] 青原樱(排列组合)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “动真格”的垃圾分类,需要你我容忍其中的
- 下一篇: 小程序开发华为P20、voiv下Echa