假设a < b,,那么路线就是0 - b - a - n,几段路径条数相乘就是结果,记忆化搜索写起来比较简单。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX_N = 10000 + 10;
const long long MOD = 1000000007;
long long dp[MAX_N];
int n, x, y, a, b;
long long DP(int e)
{
if(e < 0)
return 0;
if(e == 0)
return 1;
if(dp[e] != -1)
return dp[e];
long long ans = ((DP(e - x) % MOD) + (DP(e - y) % MOD)) % MOD;
return dp[e] = ans;
}
int main()
{
while(scanf("%d%d%d%d%d", &n, &x, &y, &a, &b) != EOF)
{
memset(dp, -1, sizeof(dp));
if(a > b)
swap(a, b);
long long ans = DP(a);
ans = ((ans % MOD) * (DP(b - a) % MOD) % MOD);
ans = ((ans % MOD) * (DP(n - b) % MOD) % MOD);
printf("%lld\n", ans);
}
return 0;
}