題目大意:
爬樓梯,要爬到n這個位置,每次可以走x也可以走y,然後一定要經過A和B兩點,求最終到達n的方案數。
思路:
昨天FZU月賽題,今天小伙伴問我的- -|||,晚上回來敲完,發現有校!!選!!!課!!!!!哭
因為一定要到達A和B,那麼直接分成0~A,A~B,B~N遞推就好了。
注意每次不要越界,比如0~A,那麼不要超過A。因為你可能超過A,沒有到A,對後面的累加有影響。(結果偏大)
詳見代碼。
#include#include #include using namespace std; const int MAXN=10000+10; const int mod=1000000007; __int64 f[MAXN]; int n,x,y,a,b; void solve(int L,int R) { for(int i=L;i<=R;i++) { if(i+x<=R) f[i+x]=(f[i]+f[i+x])%mod; if(i+y<=R) f[i+y]=(f[i]+f[i+y])%mod; } } int main() { while(~scanf(%d%d%d%d%d,&n,&x,&y,&a,&b)) { memset(f,0,sizeof(f)); if(a>b) swap(a,b); f[0]=1; solve(0,a); solve(a,b); solve(b,n); printf(%I64d ,f[n]%mod); } return 0; }