51nod 1149 Pi的遞推式

2021-07-24 08:46:07 字數 1191 閱讀 3622

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以內,求方案數。

那麼最終結果在(n-4,n]

假如最後一次加了1,那麼除去最後一次結果在(n-4-1,n-4]

假如最後一次加了pi,那麼除去最後一次結果在(n-4-pi,n-4]

我們列舉除了最後一次加了多少次pi,然後算出加1的次數上限使得總和不超過n-4。

然後不斷嘗試減小加1的次數,並計算當前在最後一次加1或pi時是否合法,合法就給答案加上乙個組合數。

如果連最後一次加pi也不能合法,那麼就退出了。

具體見**,很短

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fd(i,a,b) for(i=a;i>=b;i--)

using namespace std;

typedef long long ll;

typedef double db;

const db pi=m_pi;

const int maxn=1000000+10,mo=1000000007;

int fac[maxn],inv[maxn];

int i,j,k,l,t,n,m,ans;

int quicksortmi(int

x,int

y)int c(int n,int

m)int main()

fac[0]=1;

fo(i,1,n) fac[i]=(ll)fac[i-1]*i

%mo;

inv[n]=quicksortmi(fac[n],mo-2);

fd(i,n-1,0) inv[i]=(ll)inv[i+1]*(i+1)%mo;

fo(i,0,(int)((db)(n-4)/pi))while (i*pi+j>n-4-pi);

}printf("%d\n",ans);

}

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 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級開始走樓梯...

51nod 1149 Pi的遞推式

1149 pi的遞推式 基準時間限制 1 秒 空間限制 131072 kb 分值 640 難度 8級演算法題 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的結果即可。input 輸...