题目
思路:
公式:
f[i][j] = (f[i - 1][get_mod(j - a * (n - i), n)] + f[i - 1][get_mod(j + b * (n - i), n)]) % MOD;
1号公式:
一号公式推导过程
(a % b + b) % b; //得到正余数的公式
分析图:
代码:
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010, MOD = 100000007;//注意 MOD 复制过来,不要轻易数 0
int f[N][N];
int get_mod(int a, int b) // 求a除以b的正余数。因为只有正余数相同时,两个数相减时才能把余数部分相互减掉 。
{
return (a % b + b) % b;//得到正余数的公式
}
int main()
{
int n, s, a, b;
cin >> n >> s >> a >> b;
f[0][0] = 1;
for (int i = 1; i < n; i ++ )//到 n-1 原因:因为前 n-1 确定了话,第 n 项自然就定了(s 是固定的值)
for (int j = 0; j < n; j ++ )//余数范围 0~n-1
f[i][j] = (f[i - 1][get_mod(j - a * (n - i), n)] + f[i - 1][get_mod(j + b * (n - i), n)]) % MOD;
// 求余数是 j 的方案数
cout << f[n - 1][get_mod(s, n)] << endl;//由 一号 公式得到,前 n-1 项的余数为 s%n 时,即为可以得到的方案数。
//此处必须写成函数调用,来进行取余。s 也有可能是负数
return 0;
}