ACM—Number Sequence(HDOJ1005)

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

主要内容:

  A number sequence is defined as follows:

  f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

  Given A, B, and n, you are to calculate the value of f(n).

看到这样的公式很容易想到递归调用求解,但是在本题中n的取值范围:1<n>100000000,因此很容易报出栈溢出。因此,递归放弃。

然后便考虑到通过1 to n通过for循环进行求解。代码如下:

public void test1005(){
    Scanner in = new Scanner(System.in);
    while (in.hasNext()) {
        int A = in.nextInt();
        int B = in.nextInt();
        int n = in.nextInt();
        if (A == 0 && B == 0 && n == 0) {
            return;
        }
        int sum = 0;
        int sumPre2 = 1;
        int sumPre1 = 1;
        if(n<3){
            System.out.println(1);
            continue;
        }
        for (int i = 3; i <= n; i++) {
            sum = ((A * sumPre1) + (B * sumPre2)) % 7;
            sumPre2 = sumPre1;
            sumPre1 = sum;
        }
        System.out.println(sum);
    }
}

没有了深层的递归,栈溢出问题解决了,但是在提交之后总是Time Limit Exceeded,没办法换新方法。

想来想去没想到,最终看到acmer谈到在49次之后会发生循环,具体代码如下:

public static void test1005_02(String[] args) {
    Scanner in = new Scanner(System.in);
    while (in.hasNext()) {
        int A = in.nextInt();
        int B = in.nextInt();
        int n = in.nextInt();
        if (A == 0 && B == 0 && n == 0) {
            return;
        }
        int[] sum = new int[49];
        sum[1] = sum[2] = 1;
        for (int i = 3; i < 49; i++)
            sum[i] = ((A * sum[i - 1]) + (B * sum[i - 2])) % 7;
            System.out.println(sum[n % 49]);
    }
}

AC通过,便想为何会发生循环?

***********************************************************************

对7求摩决定了sum[i]的范围必定在0~6之间。然后又因为在A和B确定的前提下,sum[i]的值由sum[i-1]和sum[i-2]来决定的。

sum[i-1]和sum[i-2]的组合情况最多有7*7=49种。所有的组合情况必定在这49种范围内找到相同的。

需要注意的是,由于A和B的不同,在循环体中可能并不一定包含49种各种情况,可能只有部分情况包含在循环体内。如:

14种情况包含在循环体内(A=5,B=6)

4、5、0、2、3、6、6、3、2、0、5、4、1、1、4、5、0、2、3、6、6、3、2、0、5、4、1、1、4、5、0、2、3、6、6、3、2、0、5、4、1、1、4、5、0、2、3、6、
6、3、2、0、5、4、1、1、4、5、0、2、3、6、6、3、2、0、5、4、1、1、4、5、0、2、3、6、6、3、2、0、5、4、1、1、4、5、0、2、3、6、6、3、2、0、5、4、

16种情况包含在循环体内(A=1,B=1)

2、3、5、1、6、0、6、6、5、4、2、6、1、0、1、1、2、3、5、1、6、0、6、6、5、4、2、6、1、0、1、1、2、3、5、1、6、0、6、6、5、4、2、6、1、0、1、1、
2、3、5、1、6、0、6、6、5、4、2、6、1、0、1、1、2、3、5、1、6、0、6、6、5、4、2、6、1、0、1、1、2、3、5、1、6、0、6、6、5、4、2、6、1、0、1、1、

44种情况包含在循环体内(A=89564,B=185421)

4、1、5、0、4、3、3、5、3、1、0、5、2、2、1、2、3、0、1、6、6、3、6、2、0、3、4、4、2、4、6、0、2、5、5、6、5、4、0、6、1、1、4、1、5、0、4、3、
3、5、3、1、0、5、2、2、1、2、3、0、1、6、6、3、6、2、0、3、4、4、2、4、6、0、2、5、5、6、5、4、0、6、1、1、4、1、5、0、4、3、3、5、3、1、0、5、

至于哪种情况会把49种全部包括就不知道了,但是可以肯定的是,这49个数中循环体的个数必定大于等于1。

所以在进行求和处理的时候对49进行了取摩  sum[n % 49]。

时间: 2024-08-27 22:47:21

ACM—Number Sequence(HDOJ1005)的相关文章

Number Sequence (HDoj1005)

Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). Input The input consists of multiple test cases. Each test case co

Number Sequence(hdu4390)

Number Sequence Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 895 Accepted Submission(s): 374 Problem Description Given a number sequence b1,b2…bn.Please count how many number sequences a1,a2,..

HDU 5014 Number Sequence ( 构造 )

HDU 5014 Number Sequence ( 构造 ) 题目意思: 给出一个数列 由0 - n 组成 然后需要构造一个数列 (也是由0-n组成),使得 sum(A[i] ^ B[i])的值最大. 分析: 异或不能出现比这个数大的情况,,所以要从大的数往前找. 现计算出当前判断数的二进制位的位数m,然后再与2^m - 1进行异或,这样会保证最大,具体为什么,自己可以想一想 比如: 5 - 101 -- 3位 - 对应 111 101 ^ 111 = 010 代码: #include <cs

ACM学习历程——HDU 5014 Number Sequence (贪心)(2014西安网赛)

Description There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules: ● a i ∈ [0,n] ● a i ≠ a j( i ≠ j ) For sequence a and sequence b, the integrating degree t is defined as follows(“?” denotes exclus

hdu 5014 Number Sequence (贪心)

Number Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 697    Accepted Submission(s): 332 Special Judge Problem Description There is a special number sequence which has n+1 integers. F

Number Sequence(kmp)

欢迎参加——每周六晚的BestCoder(有米!) Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15007    Accepted Submission(s): 6582 Problem Description Given two sequences of numbers : a[1], a[2],

(HDU)1005 -- Number Sequence(数列)

问题描述 数列定义如下: f(1)= 1,f(2)= 1,f(n)=(A * f(n-1)+ B * f(n-2))mod 7. 给定A,B和n,你要计算f(n)的值. 输入 输入由多个测试用例组成. 每个测试用例在一行(1 <= A,B <= 1000,1 <= n <= 100,000,000)中包含3个整数A,B和n.三个零表示输入结束,此测试用例不进行处理. 输出 对于每个测试用例,在一行上输出f(n)的值. 样例输入 1 1 3 1 2 10 0 0 0 样例输出 2 5

SDUT 2044 Number Sequence(循环)

Number Sequence Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). 输入 The inpu

HDU 1005 Number Sequence(数列)

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) [Description] [题目描述] A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the