牛客 挑選方案問題(排列組合)
阿新 • • 發佈:2020-12-23
技術標籤:LintCode及其他OJ
文章目錄
1. 題目
連結:https://ac.nowcoder.com/acm/contest/10323/B
來源:牛客網
自助餐廳裡有5個盤子,裡面裝的都是麵包。
第1個盤子裡有無限個麵包;
第2個盤子裡只有1個麵包;
第3個盤子裡只有4個麵包;
第4個盤子裡也有無限個麵包,但必須兩個兩個地拿;
第5個盤子裡也有無限個麵包,但必須5個5個地拿;
給定正整數n,求有多少種正好拿出n個麵包的方案。
方案a和方案b不同,當且僅當方案a存在從某個盤子裡拿出麵包的數量與方案b中對應盤子拿出的數量不同。
示例1
輸入
1
返回值
3
說明
有3 種方案:
在第一個盤子拿一個。
在第二個盤子拿一個。
在第三個盤子拿一個。
示例2
輸入
2
返回值
6
說明
有6種方案:
在第一個盤子拿2個。
在第一個盤子拿1個,第二個盤子拿1個。
在第一個盤子拿1個,第三個盤子拿1個。
在第二個盤子拿1個,第三個盤子拿1個。
在第三個盤子拿2個。
在第四個盤子拿2個。
(請注意由於第四個盤子裡只能兩個兩個拿,所以必須拿偶數個)
備註:
n<=10^9
資料僅包含一個正整數n
輸出一個正整數表示答案。
2. 解題
- 設 1,4,5號盤子 每個盤子拿的次數為 x,y,z;2,3號盤子拿出來的個數 a,b
- 則
x
+
2
∗
y
+
5
∗
z
+
a
+
b
=
n
,
a
n
d
a
<
=
1
,
b
<
=
4
x+2*y+5*z+a+b=n, and \quad a<=1 ,\quad b<=4
- 將式子變形為 ( x ) + ( 2 y + a ) + ( 5 z + b ) = n (x)+(2y+a)+(5z+b)=n (x)+(2y+a)+(5z+b)=n,每個括號裡面都可以表示任意數字,且一旦括號的值給定了,兩個變數的值是唯一的
- 3個任意數字相加等於 n,把 n 個數分成3份
- 第一個數取0,還剩餘 n 個 數2個人分,有 n+1 種方案
- 第一個數取1,還剩餘 n-1 個 數2個人分,有 n 種方案
- …
- 第一個數取n,還剩餘 0 個 數2個人分,有 1 種方案
總方案數為
1
+
2
+
.
.
.
+
(
n
+
1
)
=
(
n
+
2
)
∗
(
n
+
1
)
/
2
=
C
n
+
2
2
1+2+...+(n+1) = (n+2)*(n+1)/2=C_{n+2}^2
1+2+...+(n+1)=(n+2)∗(n+1)/2=Cn+22
class Solution {
public:
/**
* 程式碼中的類名、方法名、引數名已經指定,請勿修改,直接返回方法規定的值即可
*
* @param n int整型
* @return long長整型
*/
long long wwork(int n) {
// write code here
return 1LL*(n+2)*(n+1)/2;
}
};
我的CSDN部落格地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!