1. 程式人生 > 其它 >牛客 挑選方案問題(排列組合)

牛客 挑選方案問題(排列組合)

技術標籤: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+2y+5z+a+b=n,anda<=1,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阿明),一起加油、一起學習進步!
Michael阿明