波动数列

简介: 波动数列

 观察这个数列:

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



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



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


【数据格式】

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

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


例如,输入:

4 10 2 3

程序应该输出:

2


【样例说明】

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


【数据规模与约定】

对于10%的数据,1<=n<=5,0<=s<=5,1<=a,b<=5;

对于30%的数据,1<=n<=30,0<=s<=30,1<=a,b<=30;

对于50%的数据,1<=n<=50,0<=s<=50,1<=a,b<=50;

对于70%的数据,1<=n<=100,0<=s<=500,1<=a, b<=50;

对于100%的数据,1<=n<=1000,-1,000,000,000<=s<=1,000,000,000,1<=a, b<=1,000,000。


题意:输入四个数n,s,a,b;


n:表示输出结果为n个数


S:表示n个数的和要为s


a:表示每次增加a


b:表示每次减少b


首先我们要知道这个数列的范围,最小值和最大值,假如n个数一直递减,每次减b,就是n*b,而我们题目要求的总和为s,所以最小值从s-n*b开始就可以了,同理最大值为s+n*a


然后从写一个递归函数把最小值到最大值依次传入,在函数里面做加a减b的操作,最后的和为题目要求的就记录下来

import java.util.Scanner;
public class Main {
  static int n, s, a, b;
  public static void main(String[] args) {
    Scanner cin = new Scanner(System.in);
    while (cin.hasNext()) {
      n = cin.nextInt();
      s = cin.nextInt();
      a = cin.nextInt();// 增加的数
      b = cin.nextInt();// 减少的数
      for (int i = s - n * b; i <= s + n * a; i++) {
        find(1, i + " ", i, i);
      }
      System.out.println(id%100000007);
      id=0;
    }
    cin.close();
  }
  static int id=0;
  public static void find(int d, String str, int ss, int sum) {//d用来记录个数,str保存结果,ss当前的数,sum所有数的总和
    if (d == n && sum == s) {// 个数达到时
      id++;
      System.out.println(str);
    } else if (d > n) {//个数超过时返回
      return;
    } else {
      int s1 = ss + a;//增加a后的数
      find(d + 1, str + s1 + " ", s1, sum + s1);
      int s2 = ss - b;//减少b后的数
      find(d + 1, str + s2 + " ", s2, sum + s2);
    }
  }
}


相关文章
|
6月前
|
算法 程序员
【算法训练-二分查找 三】【特殊二分】寻找峰值
【算法训练-二分查找 三】【特殊二分】寻找峰值
57 0
|
3月前
|
算法
【算法】二分算法——寻找峰值
【算法】二分算法——寻找峰值
|
4月前
|
人工智能 算法
算法金 | 平均数、众数、中位数、极差、方差,标准差、频数、频率 一“统”江湖
**统计学江湖概要** - **平均数(均值)**:数字的总和除以数量,代表集中趋势,如分赃时平均分配。 - **众数**:出现次数最多的数字,反映了最常见的值,如同一招式被频繁使用。 - **中位数**:排序后位于中间的值,反映数据的中心位置,如同武者武功的中等水平。 - **极差**:最大值减最小值,表示数据波动范围,类似武功最高与最低的差距。 - **方差**:衡量数据波动性,计算每个数值与均值差的平方和的平均数。 - **标准差**:方差的平方根,同单位的波动度量。 - **频数**:某个值出现的次数,如统计武器使用情况。 - **频率**:频数与总次数的比例,显示出现的相对频率。
87 2
算法金 | 平均数、众数、中位数、极差、方差,标准差、频数、频率 一“统”江湖
|
6月前
|
C++
数的三次方根(二分查找的应用)
数的三次方根(二分查找的应用)
1.2 数列的极限
1.2 数列的极限
55 0
|
6月前
|
算法 测试技术 C#
【二分查找】【滑动窗口】最大化城市的最小电量
【二分查找】【滑动窗口】最大化城市的最小电量
|
6月前
|
算法 测试技术 C++
【二分查找】【滑动窗口】LeeCode2528:最大化城市的最小电量
【二分查找】【滑动窗口】LeeCode2528:最大化城市的最小电量
|
11月前
|
算法 搜索推荐 Java
算法分析 | 第二套(最差、平均和最佳情况)
算法分析 | 第二套(最差、平均和最佳情况)
46 0
1241:二分法求函数的零点 2020-12-27
1241:二分法求函数的零点 2020-12-27
|
算法 C语言 C++
【二分查找】275. H 指数 II
【二分查找】275. H 指数 II 在另一篇博客里讲过二分法的模板: 《二分法的模板讲解》
78 0