zl程序教程

您现在的位置是:首页 >  其它

当前栏目

波动数列(组合DP变形)

DP 组合 数列 变形 波动
2023-09-14 09:01:26 时间

观察这个数列:

1 3 0 2 -1 1 -2 …

这个数列中后一项总是比前一项增加2或者减少3,且每一项都为整数。

栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加 a 或者减少 b 的整数数列可能有多少种呢?

输入格式
共一行,包含四个整数 n,s,a,b,含义如前面所述。

输出格式
共一行,包含一个整数,表示满足条件的方案数。

由于这个数很大,请输出方案数除以 100000007 的余数。

数据范围
1≤n≤1000,
−109≤s≤109,
1≤a,b≤106
输入样例:
4 10 2 3
输出样例:
2
样例解释
两个满足条件的数列分别是2 4 1 3和7 4 1 -2。

n,s,a,b = list(map(int,input().strip().split()))
f= [[0 for i in range(1010)] for i in range(1010)] # f[i][j] 代表所有前i个数 总和%mod == j的集合
mod = 100000007

f[0][0] = 1 # 不取数的情况下

for i in range(1,n+1):
    for j in range(n):
        f[i][j] = (f[i-1][(j-(n-i)*a)%n] % mod + f[i-1][(j+(n-i)*b)%n]) % mod
print(f[n-1][s%n]) # n-1个数的组合,排除了第一个数