BZOJ2173 整數的lqp拆分(生成函式)

2022-05-22 00:00:12 字數 986 閱讀 3666

首先有序整數拆分有個顯然的遞推式是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。

又是乙個卷積。是不是可以直接算了?啊要分治fftn有1e6而且還不是ntt模數……肯定跑不過去啊。於是考慮生成函式。

設其生成函式為f(x),斐波拉契數列的生成函式為fib(x)。則f(x)=f(x)·fib(x)+1。因為f(0)=1是我們的特殊規定所以補上1。即有f(x)=1/(1-fib(x))。

考慮求出fib(x)的有限表示。可以把fib(n)的遞推式也看做卷積。設a1=1,a2=1,則有fib(n)=σfib(i)a(n-i)  (i=0~n-1)。而a的生成函式為a(x)=x+x2。那麼有fib(x)=fib(x)·a(x)+x。有fib(x)=x/(1-a(x))=x/(1-x-x2)。於是代入得f(x)=1/[1-x/(1-x-x2)]=1-x/(x2+2x-1)。

這個求出來……多項式求逆?照樣**啊。

據說可以用特徵根。然而那是啥玩意啊?

推了半天……不如打表!

則顯然f(n)=2f(n-1)+f(n-2)。

#include#include

#include

#include

#include

#include

using

namespace

std;

intread()

while (c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+(c^48),c=getchar();

return x*f;

}#define p 1000000007

#define n 1000010

intn,f[n];

intmain()

bzoj2173 整數的lqp拆分

lqp在為出題而煩惱,他完全沒有頭緒,好煩啊 他首先想到了整數拆分。整數拆分是個很有趣的問題。給你乙個正整數n,對於n的乙個整數拆分就是滿足任意m 0,a1 a2 a3 am 0,且a1 a2 a3 am n的乙個有序集合。通過長時間的研究我們發現了計算對於n的整數拆分的總數有乙個很簡單的遞推式,但...

bzoj2173 整數的lqp拆分

lqp在為出題而煩惱,他完全沒有頭緒,好煩啊 他首先想到了整數拆分。整數拆分是個很有趣的問題。給你乙個正整數n,對於n的乙個整數拆分就是滿足任意m 0,a1 a2 a3 am 0,且a1 a2 a3 am n的乙個有序集合。通過長時間的研究我們發現了計算對於n的整數拆分的總數有乙個很簡單的遞推式,但...

國家集訓隊 整數的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 發...