波动数列

观察这个数列:

1 3 0 2 -1 1 -2 …

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

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

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

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

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

数据范围
1 n 1000 , 1≤n≤1000,
1 0 9 s 1 0 9 , −10^9≤s≤10^9,
1 a , b 1 0 6 1≤a,b≤10^6
输入样例:

4 10 2 3

输出样例:

2

样例解释

两个满足条件的数列分别是2 4 1 3和7 4 1 -2。
分析
f [ i ] [ j ] f[i][j] 表示只考虑前 i i 项,且当前的总和除以 n n 的余数是 j j 的方案的集合。

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 1005, MOD = 100000007;

int f[N][N];

int get_mod(int a, int 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 - 1; i++)
	{
		for (int j = 0; j <= n - 1; j++)
		{
			f[i][j] = (f[i - 1][get_mod(j - a * i, n)] + f[i - 1][get_mod(j + b * i, n)]) % MOD;
		}
	}
	
	cout << f[n - 1][s % n] << endl;
	
	return 0;
}
发布了409 篇原创文章 · 获赞 73 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43469554/article/details/103944300