Java蓝桥杯 历届试题 波动数列
2017-04-06 16:11
260 查看
问题描述
观察这个数列:
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。
输入给出了所有数的和s,假设该数列的第一个数为i,那么它的取值范围为[s - n * a, s + n * b]。
用搜索搜出所有取值之内数列中后一项总是比前一项增加2或者减少3的情况
观察这个数列:
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。
输入给出了所有数的和s,假设该数列的第一个数为i,那么它的取值范围为[s - n * a, s + n * b]。
用搜索搜出所有取值之内数列中后一项总是比前一项增加2或者减少3的情况
/** * */ package 历届试题; import java.util.Scanner; /** * @author Administrator * */ public class 历届试题波动数列 { /** * @param args * 观察这个数列: 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。 */ public static int count=0; public static int sum; public static int a,b,n,s; public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); n=sc.nextInt(); s=sc.nextInt(); a=sc.nextInt(); b=sc.nextInt(); System.out.println(n); System.out.println(s); System.out.println(a); System.out.println(b); for (int i=s-n*b;i<s+n*a;i++) { sum=0; DFS(i, n-1); } System.out.println(count%100000007); } public static void DFS(int i,int num) { sum+=i; if (num<0) { return; } if (num==0) { if (sum==s) { count++; sum-=i; return; } else { sum-=i; return; } } DFS(i+a, num-1); DFS(i-b, num-1); sum-=i; } }
相关文章推荐
- 转 蓝桥杯 历届试题 波动数列 [ dp ]
- 【蓝桥杯】历届试题 波动数列(运行超时)
- 算法笔记_172:历届试题 波动数列(Java)
- 蓝桥杯 历届试题 波动数列 DP 01背包 滚动数组
- 蓝桥杯 历届试题 波动数列
- 蓝桥杯javaB组试题之Fibonacci数列求余问题
- 历届试题 波动数列
- 蓝桥 PREV-30 历届试题 波动数列 【动态规划】
- 蓝桥杯 历届试题 分糖果 java
- Java蓝桥杯历届试题 小朋友排队--运行超时,内存超大
- 历届试题 波动数列
- 蓝桥杯 历届试题 PREV-12 危险系数 并查集找割点 Java
- 蓝桥 PREV-30 历届试题 波动数列 【动态规划】
- 历届试题 波动数列 (未完成)
- 第五届蓝桥杯A组java—波动数列
- 蓝桥杯 历届试题 核桃的数量 java详解
- 蓝桥杯 PREV-3 历届试题 带分数 Java版
- Java - 蓝桥杯 - 历届试题 错误票据
- Java蓝桥杯历届试题 分糖果
- 蓝桥杯 历届试题 打印十字图 java详解