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]。
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 ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- ACM学习历程——HDU 5014 Number Sequence (贪心)(2014西安网赛)
Description There is a special number sequence which has n+1 integers. For each number in sequence, ...
- Number Sequence(hdu4390)
Number Sequence Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- HDU 1711 Number Sequence(KMP)附带KMP的详解
题目代号:HDU 1711 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/ ...
- 1005 Number Sequence(HDU)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 Number Sequence Time Limit: 2000/1000 MS (Java/O ...
- Number Sequence(kmp)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- POJ - 1019 Number Sequence (思维)
https://vjudge.net/problem/POJ-1019 题意 给一串1 12 123 1234 12345 123456 1234567 12345678 123456789 1234 ...
随机推荐
- Android 按二次后退键退出应用程序
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充
EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) EO理论上 ...
- C++类訪问控制及继承
一.C++类的訪问控制有三类:public,protected和private. 类訪问控制符 类成员可被哪些对象訪问 public 1.类的成员函数.2.类对象.3.友元.4.子类成员函数 prot ...
- [Redux] Extracting Container Components -- Complete
Clean TodoApp Component, it doesn't need to receive any props from the top level component: const To ...
- linux的chattr和lsattr命令
chattr是用来改变文件.目录属性.chattr命令的作用很大,其中一些功能是由linux内核版本来支持的.通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录.lsattr是 ...
- js方法调用
<!DOCTYPE html> <html> <head> <title>测试</title> </head> <body ...
- 获取Excel表中各个Sheet的方法
获取Excel表中各个Sheet的方法 private void simpleButton2_Click(object sender, EventArgs e) { OfdBOM.Filter = & ...
- vs2015体验
项目结构 bower.json Bower依据此文件安装需要的前端的包 package.json NPM依据此文件获取对应的包 project.json 包含用于NPM的"poststore ...
- PixelFormat 枚举
成员名称 说明 Alpha 像素数据包含没有进行过自左乘的 alpha 值. Canonical 默认像素格式,每像素 32 位. 此格式指定 24 位颜色深度和一个 8 位 alpha 通道. Do ...
- textField:shouldChangeCharactersInRange:replacementString:
http://blog.csdn.net/mamong/article/details/44964801