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 ...
随机推荐
- table表格边框样式
; border-left:1px solid #aaa; border-top:1px solid #aaa; } td{border-right:1px solid #aaa; border-bo ...
- 随着时间的推移:构造SDK路径错误(An error occurred while automatically activating bundle com.android.ide.eclipse.adt)
在进行Android应用的开发过程中,有时候在配置SDK路径的时候(Windows->Preferences->Android).会出现例如以下报错:An error occurred w ...
- jquery获取当前元素坐标
1. jquery获取当前元素坐标 A) 获取对象
- Linux系统相关
1. 图形界面启动的是哪个运行级别? 而我们平时用的命令行模式又是哪个运行级别? 除了图形和命令行模式两个常用级别外,其他运行级别代表什么涵义?如何更改系统的运行级别?图形界面启动的是5级别,命令行模 ...
- js获取当前页面的网址域名地址
1.获取当前完整网址thisURL = document.URL;thisHREF = document.location.href;thisSLoc = self.location.href;thi ...
- Material Calendar View 学习记录(二)
Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...
- js参数截取
原代码: function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^& ...
- Java数据库缓存思路
为什么要用缓存?如果问这个问题说明你还是新手,数据库吞吐量毕竟有限,每秒读写5000次了不起了,如果不用缓存,假设一个页面有100个数据库操作,50个用户并发数据库就歇菜,这样最多能支撑的pv也就50 ...
- JSONP有什么作用
1.解决跨域访问数据 由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名.协议.端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求 ...
- 如何利用putty的密钥登陆
1.登陆主机,输入:mkdir /root/.ssh(创建SSH密钥目录) touch /root/.ssh/authorized_keys (创建SSH密钥文件): 2.输入:vi /root/ ...