开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情
[蓝桥杯 2014 省 A] 波动数列
题目描述
观察这个数列:
。
这个数列中后一项总是比前一项增加 或者减少 。
栋栋对这种数列很好奇,他想知道长度为 和为 而且后一项总是比前一项增加 或者减少 的整数数列可能有多少种呢?
输入格式
输入的第一行包含四个整数 ,含义如前面说述。
输出格式
输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以 的余数。
样例 #1
样例输入 #1
4 10 2 3
样例输出 #1
2
提示
【样例说明】
这两个数列分别是 2 4 1 3 和 7 4 1 -2。
【数据规模与约定】
对于 的数据,,,;
对于 的数据,,,;
对于 的数据,,,;
对于 的数据,,,;
对于 的数据,,,。
时限 1 秒, 256M。蓝桥杯 2014 年第五届省赛
分析
这也是一个dp题,可以通过化简得到一个式子,最后分成两种情况讨论。
代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define int long long
#include <map>
using namespace std;
const int N=1010;
const int mod=100000007;
int n,s,a,b;
int get_mod(int a,int b){
return (a%b+b)%b;
}
int dp[N][N];
signed main(){
cin>>n>>s>>a>>b;
dp[0][0]=1;
for(int i=1;i<n;i++){
for(int j=0;j<n;j++){
dp[i][j]=(dp[i-1][get_mod(j-(n-i)*a,n)]+dp[i-1][get_mod(j+(n-i)*b,n)])%mod;
}
}
cout<<dp[n-1][get_mod(s,n)];
return 0;
}