大神與三位小夥伴

2021-06-21 13:25:19 字數 1791 閱讀 3827

程式設計之美資格賽2014

時間限制:

2000ms

單點時限:

1000ms

記憶體限制:

256mb

因為方案數可能非常大,大神同學希望知道挑選紀念品的方案數模10^9+7之後的答案。

第一行包括乙個數t,表示資料的組數。

接下來包含t組資料,每組資料一行,包括乙個整數n。

對於每組資料,輸出一行「case x: 」,其中x表示每組資料的編號(從1開始),後接乙個數,表示模10^9+7後的選擇紀念品的方案數。

小資料:

1<=t<=10

1<=n<=100

大資料:

1<=t<=1000

1<=n<=10^18

對於第二組資料,合法的方案有以下幾種,(x,y,z)表示選擇了a類紀念品中價值為x的,b類紀念品中價值為y的,c類紀念品中價值為z的。

(1,1,1): 3*3*3=27種

(1,2,3): 3*2*1=6種

(1,3,2): 3*1*2=6種

(2,1,3): 2*3*1=6種

(2,2,2): 2*2*2=8種

(2,3,1): 2*1*3=6種

(3,1,2): 1*3*2=6種

(3,2,1): 1*2*3=6種

(3,3,3): 1*1*1=1種

一共27+6+6+6+8+6+6+6+1=72種選擇紀念品的方案

注意,如(1,1,2), (2,3,3), (3,1,3)都因為恰好選擇了兩件價值相同的紀念品,所以並不是一種符合要求的紀念品選擇方法。

分析:

對大資料蠻力方法無法解決。只能從數學角度分析,求出遞推式或表示式。

題目中「其中種類為a_i, b_i, c_i的紀念品價值均為i, 且分別有n+1-i個剩餘」與「其中種類為a_i, b_i, c_i的紀念品價值均為i, 且分別有i個剩餘」等效。

設f(n)表示每類紀念品各有n種時所有的方案數,則有

f(n) = f(n-1) + 3*n*f2

(n-1) + n*n*n, n>1; f(1) = 1

其中,f2

(n) =f2

(n-1) + 2*n*f1

(n-1), n>1;f1

(1) = 0,f1

(n) =f1

(n-1) + n, n>1;f1

(1) = 1

至此,如果直接利用遞推公式,則時間複雜度為o(n),仍不能處理大資料測試,需進行化簡。簡單計算後可得:

f(n) = (n^6 - n^5 -n^4 +5*n^3 + 4*n^2)/8

此時,時間複雜度為o(1)。

**:

//f(n) = (n^6 - n^5 -n^4 +5*n^3 + 4*n^2)/8%(10^9 + 7)

// if (a + b) can be divided by c, then (a + b)/c%d = (a%(c*d)+a%(c*d))%(c*d)/c

#include using namespace std;

int main(void)

mod += 7;

mod *= ***;

int t;

int cnt = 0;

cin >> t;

while (cnt++ < t)

return 0;

}

題目2 大神與三位小夥伴

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 因為方案數可能非常大,大神同學希望知道挑選紀念品的方案數模10 9 7之後的答案。第一行包括乙個數t,表示資料的組數。接下來包含t組資料,每組資料一行,包括乙個整數n。對於每組資料,輸出一行 case x 其中x表示每組資料的編...

程式設計之美資格賽 大神與三位小夥伴

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 因為方案數可能非常大,大神同學希望知道挑選紀念品的方案數模10 9 7之後的答案。第一行包括乙個數t,表示資料的組數。接下來包含t組資料,每組資料一行,包括乙個整數n。對於每組資料,輸出一行 case x 其中x表示每組資料的編...

程式設計之美2014 大神與三位小夥伴

問題 時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 描述l 國是乙個有著優美景色且物產豐富的國家,很多人都喜歡來這裡旅遊並且喜歡帶走一些紀念品,大神同學也不例外。距離開 l國的時間越來越近了,大神同學正在煩惱給她可愛的小夥伴們帶什麼紀念品好,現在擺在大神同學面前的有三類紀念...