欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

杭电OJ 1005

程序员文章站 2024-03-19 19:01:34
...

杭电OJ 1005

 依次求值,代码如下:

//杭电OJ 1005 张艺川 2018/1/27
#include<iostream>
using namespace std;
int main(){
	int A, B, n;
	while (cin >> A >> B >> n && A != 0){//由题目给出范围简化判定条件
		int *number = new int[n];
		number[0] = 1;
		number[1] = 1;
		for (int i = 2; i < n; i++){
			number[i] = A*number[i - 1] + B*number[i - 2];
			number[i] %= 7;
		}
		cout << number[n - 1] << endl;
		delete[]number;
	}
	return 0;
	
}
 运行结果:内存使用过大。

 分析原因:不必将每一个中间结果都存入数组,每一个中间结果使用两次。

于是我考虑不用数组存,直接迭代的计算,代码如下:

//杭电OJ 1005 张艺川 2018/1/27
#include<iostream>
using namespace std;
int main(){
	int A, B, n;
	int firstNum;
	int secondNum;
	int sum;
	while (cin >> A >> B >> n && A != 0){//由题目给出范围简化判定条件
		firstNum = 1;
		secondNum = 1;
		sum = 0;
		for (int i = 0; i < n-2; i++){
			sum = B*firstNum + A*secondNum;
			sum %= 7;
			firstNum = secondNum;
			secondNum = sum;
		}
		cout << sum << endl;
	}
	return 0;
	
}

 精彩的地方到了。又出问题了。这次是时间超出要求了。那我就很难过了。

于是开始查询大佬们的做法,得到了一种精巧的解答。考虑循环节,这种规律的计算,不会是无线不循环的序列,一定会在某一个地方开始循环,但是并不定出现在开始,也可能过几个才开始循环。

 一种比较优秀的做法是这样考虑:第一个数的取值范围为0到6,总共7种第二个数也是如此。故总共7*7=49种组合,多于49的组合必然会出现重复的情况。所以只需计算前49种,之后讲n mod49即可。代码如下:

//杭电OJ 1005 张艺川 2018/1/29
#include<iostream>
using namespace std;
int main(){
	int A, B, n;
	int number[49];//7*7最多49种组合,多于49的其他情况一定会重复
	number[0] = 1;
	number[1] = 1;
	while (cin >> A >> B >> n && A != 0){//由题目给出范围简化判定条件
		for (int i = 2; i < 49; i++){//计算前49种情况
			number[i] = A*number[i - 1] + B*number[i - 2];
			number[i] %= 7;
		}
		cout << number[(n - 1) % 49] << endl;
	}
	return 0;
	
}




相关标签: 循环节