51NOD 1149 Pi的遞推式 題解

2022-05-16 12:00:47 字數 1514 閱讀 1589

f(x) = 1 (0 <= x < 4)

f(x) = f(x - 1) + f(x - pi) (4 <= x)

pi = 3.1415926535.....

現在給出乙個n,求f(n)。由於結果巨大,只輸出mod 10^9 + 7的結果即可。

不好想啊……以及我曾經打了個表,並且還找到了規律,結果過到29就gg了……

參考:(這個參考是個神,我這樣的凡人能解讀到這種地步已經很不容易了)

總覺得我講的很有問題啊……那我就順著這個參考講吧……

將遞迴展開,你就會發現是一張圖,而所求即為最上層點到最下層點的方案路徑數。

設$p[i]$表示到$i$這個點減幾次pi到達其中乙個終點,於是我們到達一次終點所需要經過的整數結點(即-1)與"非整數"結點(即-pi),可以通過設前者為$n-i$,則後者為$p[i]$,路徑條數就可以用組合數求出。

但是要注意的是我們只要到達其中乙個目標即會停止,即5-1-pi是合法的,而5-pi-1則是不可能的,即有些pi只能放在最後減,我們需要把這些pi扣除。

其實並不存在「這些」,事實上顯然我們只有乙個pi,也就是說下面的關鍵是判斷這個pi是否會導致我們提前結束。

我們考慮,只要$i$的父親結點(其實是$i+1$,但叫做父親節點更好懂些)$p[i+1]>p[i]$,那麼我們隨便了,提前拐或者不拐最終到達的狀態一定一致。

但是如果不滿足的話,則我們在$i+1$或更早處轉彎的話,就一定會導致我們提早結束,所以此時我們扣除這個pi即可。

這是這個參考的做法,個人感覺並不如:這個更好想一些,但是解法比較自然,順暢。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

double

dl;typedef

long

long

ll;const dl pi=acos(-1.0

);const

int p=1e9+7

;const

int n=1e6+5

;inline

int qpow(int k,int

n)

return

res;

}int

jc[n],inv[n],p[n];

void init(int

n)inline

int c(int n,int

m)int solve(int

n)

return

ans;

}int

main()

51nod1149 Pi的遞推式

f x 1 0 x 4 f n f n 1 f n pi 4 x pi 3.1415926535 現在給出乙個n,求f n 由於結果巨大,只輸出mod 10 9 7的結果即可。n 1000000 乙個很好的思路。這樣的遞推過程可以看成乙個dag,求編號為n的點到編號為的點到的路徑總數。首先對最後一步...

51nod 1149 Pi的遞推式

f x 當0 x 4時等於1,x 4時等於f x 1 f x pi 求f n n 4就輸出一,接下來只討論n 4的情況 根據觀察遞推式,我們可以轉化問題 給你乙個n,每次可以減一或減pi,直至減到小於4,求方案數。減看起來不直觀,改為加 從乙個0開始,每次加1或加pi,直至加到與n相差在4以內,求方...

51NOD 1149 Pi的遞推式

f x 1 0 x 4 f n f n 1 f n pi 4 x pi 3.1415926535 現在給出乙個n,求f n 由於結果巨大,只輸出mod 10 9 7的結果即可。我們先來想一下斐波拉切數列的遞推式 fi fi 1 fi 2 f 0 1,f1 1 我們發現,問題等價於問從第0級開始走樓梯...