波动数列

来源:互联网 发布:搜狗 数据分析 面试 编辑:程序博客网 时间:2024/04/27 16:24
  观察这个数列:
    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);}}}


1 0