程式設計之美資格賽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國的時間越來越近了,大神同學正在煩惱給她可愛的小夥伴們帶什麼紀念品好,現在擺在大神同學面前的有三類紀念...