lqp在為出題而煩惱,他完全沒有頭緒,好煩啊… 他首先想到了整數拆分。整數拆分是個很有趣的問題。給你乙個正整數n,對於n的乙個整數拆分就是滿足任意m>0,a1 ,a2 ,a3…am>0,且a1+a2+a3+…+am=n的乙個有序集合。通過長時間的研究我們發現了計算對於n的整數拆分的總數有乙個很簡單的遞推式,但是因為這個遞推式實在太簡單了,如果出這樣的題目,大家會對比賽毫無興趣的。然後lqp又想到了斐波那契數。定義f0=0,f1=1,fn=fn-1+fn-2 (n>1),fn就是斐波那契數的第n項。但是求出第n項斐波那契數似乎也不怎麼困難… lqp為了增加選手們比賽的慾望,於是絞盡腦汁,想出了乙個有趣的整數拆分,我們暫且叫它:整數的lqp拆分。和一般的整數拆分一樣,整數的lqp拆分是滿足任意m>0,a1 ,a2 ,a3…am>0,且a1+a2+a3+…+am=n的乙個有序集合。但是整數的lqp拆分要求的不是拆分總數,相對更加困難一些。對於每個拆分,lqp定義這個拆分的權值fa1fa2…fam,他想知道對於所有的拆分,他們的權值之和是多少?簡單來說,就是求 由於這個數會十分大,lqp稍稍簡化了一下題目,只要輸出對於n的整數lqp拆分的權值和mod 109(10的9次方)+7輸出即可。
輸入的第一行包含乙個整數n。
輸出乙個整數,為對於n的整數lqp拆分的權值和mod 109(10的9次方)+7。
3
5
20%資料滿足:1≤n≤25 50%資料滿足:1≤n≤1000 100%資料滿足:1≤n≤1000000
貌似並不需要生成函式啊...為啥好像題解都是生成函式..
設\(a_n\)表示\(n\)的拆分的答案,列舉拆分的最後乙個位置放什麼,可得:
\[a_n=\sum_^a_f_
\]然後根據斐波那契數列的性質:
\[f_=f_+f_
\]那麼注意到\(f_\)可以拆分,可得:
\[\begin
a_n&=\sum_^a_f_\\
&=\sum_^a_f_+a_\\
&=\sum_^a_if_+\sum_^a_if_+a_\\
\end
\]注意到:
\[\begin
a_&=\sum_^a_f_\\
a_&=\sum_^a_f_\\
\end
\]帶入可得:
\[\begin
a_n&=\sum_^a_if_+\sum_^a_if_+a_+a_f_\\
&=2a_+a_
\end
\]由於\(n\leqslant1e6\),暴算就行了。
update on 19.5.14:
今天偶然看到這個題,發現其實生成函式做這個題很簡單:
這題給出來的是個揹包,所以答案就是:
\[[x^n]\sum_^f^i(x)=\frac
\]左邊是列舉放了多少個,\(f(x)\)是斐波那契數列的冪級數。
眾所周知斐波那契的生成函式是這樣的:
\[\begin
f(x)&=x^2f(x)+xf(x)+x\\f(x)&=\frac
\end
\]帶入可得答案為:
\[[x^n]g(x)=[x^n]\frac
\]展開就是:
\[g(x)=2xg(x)+x^2g(x)+x
\]可以得到上面的遞推式。
#includeusing namespace std;
void read(int &x)
void print(int x)
void write(int x)
const int maxn = 1e6+2;
const int mod = 1e9+7;
int f[maxn];
int main()
bzoj2173 整數的lqp拆分
lqp在為出題而煩惱,他完全沒有頭緒,好煩啊 他首先想到了整數拆分。整數拆分是個很有趣的問題。給你乙個正整數n,對於n的乙個整數拆分就是滿足任意m 0,a1 a2 a3 am 0,且a1 a2 a3 am n的乙個有序集合。通過長時間的研究我們發現了計算對於n的整數拆分的總數有乙個很簡單的遞推式,但...
BZOJ2173 整數的lqp拆分(生成函式)
首先有序整數拆分有個顯然的遞推式是g n g i i 0 n 1 即列舉加入最後乙個數之前和是多少。雖然不用遞推式也能顯然地知道答案是2n 1 類似地,lqp拆分有遞推式f n f i fib n i i 0 n 1 由乘法分配律就可以推出。特別地,f 0 1。又是乙個卷積。是不是可以直接算了?啊要...
國家集訓隊 整數的lqp拆分
題面 題解見 注釋 或者我回來會放我在洛谷上寫的題解 設 g i 為i的lqp拆分的權值和,則 g i f j g i j f i 其中 g 0 0,g 1 1.以前是推式子推出來結果的,那麼今天就嘗試用生成函式做一下 設 a f i x i b g i x i 那麼 b a b a.解一下 b 發...