杭电OJ 1005
程序员文章站
2024-03-19 19:01:34
...
依次求值,代码如下:
//杭电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;
}