挑選方案問題(牛客競賽 思維題+推導公式)

Piink發表於2020-12-22

連結:https://ac.nowcoder.com/acm/contest/10322/C
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
自助餐廳裡有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
輸出一個正整數表示答案。

思路:

n方案數n與n-1方案數的差值
13/
263
3104
4155
5216

根據表中我們很容易知道,他們的差值是不斷加1的,但是通過迴圈每次加1這種方法是不可行的,因為資料太大,執行必定超時,故我們可以推出他的公式。
推導公式是:

方案數=(n+4)*(n-1)/ 2+3

知道公式程式碼就非常簡單了,但題目給的n是int型,需要強制轉換為long long 否則會錯誤,下面的程式碼我是直接定義的long long n

程式碼:

#include<stdio.h>
int main()
{
    long long n;
    scanf("%lld",&n); //這裡需要將n強制轉換,但這裡沒有寫出
    long long s=(n+4)*(n-1)/2+3;
    printf("%lld\n",s);
    return 0;
}

相關文章