波动数列
AcWing 1214. 波动数列 - AcWing 来自 acwing 大佬的笔记
import java.util.Scanner;
public class N215 {
static int N = 1010, mod = 100000007;
static int n, s, a, b;
static int[][] f = new int[N][N]; // 选前i个数中 余数为j的方案数
static int get_mod(int a, int b) // 求a除以b的正余数 --> core
{
return (a % b + b) % b; // 这里的 (a % b + b) 是为了不出现负数,因为负数对正数取余会有负数
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
s = scanner.nextInt();
a = scanner.nextInt();
b = scanner.nextInt();
f[0][0] = 1;// 含义:只有一项 x 余数为 0 的方案数为 1
for (int i = 1; i <= n - 1; i++) {
for (int j = 0; j <= n - 1; j++) {
f[i][j] = (f[i - 1][get_mod(j - (n - i) * a, n)] + f[i - 1][get_mod(j + (n - i) * b, n)]) % mod;
}
}
System.out.println(f[n - 1][get_mod(s, n)]);
}
}
AcWing 来自 acwing 大佬的笔记,闫氏dp分析法具体步骤