波动数列(蓝桥杯)

问题描述:

观察如下数列:

1 3 0 2 -1 1 -2 ...

这个数列中后一项总是比前一项增加 2 或者减少 3。

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

输入格式

输入的第一行包含四个整数 n s a b n\ s\ a\ bn s a b,含义如前面说述。

输出格式

输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以 100000007 的余数。

样例输入

4 10 2 3

样例输出

2

样例说明

这两个数列分别是 {2 4 1 3} 和 {7 4 1 -2}。

暴力解法(超时):

cpp 复制代码
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
#define base 100000007
int n,s,a,b;
long long sum=0;
void check(int k)
{
    double change=s-k;
    double first=change/n;
    if(fmod(first,1)==0)
    {//计算出的第一个数为整数
        sum++;
        sum%=base;
    }
}
void calculate(int,int);

int main()
{
    cin>>n>>s>>a>>b;
    calculate(n-1,0);
    cout<<sum;
    return 0;
}
void calculate(int layer,int u)
{//递归出口
    if(layer==0)
    {
        check(u);
        return;
    }
    int addition=layer*a;
    calculate(layer-1,u+addition);
    addition=(-b)*layer;
    calculate(layer-1,u+addition);
}

动态规划:

cpp 复制代码
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
#define base 100000007
long long a,b,n,s;
const int N=1000010;
int f[N]={0};
//f[i][j]表示从(1~n-1)中前i个数中选择使得和为j的种类数
//f[i][j]=f[i-1][j]+f[i-1][j-i];    f[i][0]=1;
void create()
{//参考01背包问题
    f[0]=1;
    for(int i=1;i<=n-1;i++)
    {
        int num=i*(i+1)/2;
        for(int j=num;j>=i;j--)
        {//需要倒序使得f[j-1]为f[i-1][j-1];
            f[j]=(f[j]+f[j-i])%base;
        }
    }
}

void calculate();

int main()
{
    cin>>n>>s>>a>>b;
    create();
    calculate();
    return 0;
}
void calculate()
{
    int num=n*(n-1)/2;
    long long sum=0;
    for(int i=0;i<=num;i++)
    {
        long long u=i*a-(num-i)*b;
        long long temp=s-u;
        if(temp%n==0)
        {//n-1个位置取i个位置
            sum=(sum+f[i])%base;
        }
    }
    cout<<sum;
}
相关推荐
代码充电宝1 小时前
LeetCode 算法题【简单】20. 有效的括号
java·算法·leetcode·面试·职场和发展
海琴烟Sunshine1 小时前
leetcode 119. 杨辉三角 II python
算法·leetcode·职场和发展
小杨的全栈之路1 小时前
霍夫曼编码:数据压缩的核心算法详解(附图解 + 代码)
算法
cjinhuo2 小时前
标签页、书签太多找不到?AI 分组 + 拼音模糊搜索,开源插件秒解切换难题!
前端·算法·开源
贝塔实验室2 小时前
频偏估计方法--快速傅里叶变换(FFT)估计法
网络协议·算法·数学建模·动态规划·信息与通信·信号处理·傅立叶分析
闭着眼睛学算法2 小时前
【双机位A卷】华为OD笔试之【模拟】双机位A-新学校选址【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·javascript·c++·python·算法·华为od
玉夏2 小时前
【每日算法C#】爬楼梯问题 LeetCode
算法·leetcode·c#
学好statistics和DS3 小时前
【CV】泊松图像融合
算法·计算机视觉
贝塔实验室3 小时前
QPSK信号载波同步技术---极性Costas 法载波同步
计算机网络·算法·网络安全·数学建模·信息与通信·信号处理·傅立叶分析
前端小刘哥3 小时前
视频直播点播平台EasyDSS视频直播功能的技术实现与应用场景解析
算法