当前位置:   article > 正文

波动数列 (蓝桥杯)_蓝桥杯 波动数列 python

蓝桥杯 波动数列 python
标题:波动数列

    观察这个数列:
    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。

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 2000ms

 

import java.util.Scanner;
public class Main {
    static int n=0;
    static int s=0;
    static int a=0;
    static int b=0;
    static int sum=0;
    static int count=0;
    public static void dfs(int num,int step) {
        if(step>n) {
            return;
        }
        if(step==n) {
            if(sum==s) {
                count=(count+1)%1000000007;
                return;
            }
        }
        sum+=num;
        dfs(num+a,step+1);
        dfs(num-b,step+1);
        sum-=num;
        return;
    }
    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();
    for(int i=s-n*a;i<=s+n*b;i++) {
        dfs(i,1);
    }
    System.out.println(count);
    }
}


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/200637
推荐阅读
相关标签
  

闽ICP备14008679号