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).
作为小编我也很无语啊,我也是服了,用了这么多方法,要不就是内存,要么就是超时
递归_内存超了
using namespace std;
int f(int A, int B, int n)
{ if (n == 1)
return 1;
else if (n == 2)
return 1;
else
return (A * f(A, B, n - 1) + B * f(A, B, n - 2)) % 7;
}
void main()
{
int A, B, n;
for (;;)
{
cin >> A >> B >> n;
if (A >= 1 && A <= 1000 && B >= 1 && B <= 1000 && n >= 1 && n <= 100000000)
cout << f(A, B, n) << endl;
else if (A == B == n == 0)
break;
}
}
数组_超时
#include<iostream>
using namespace std;
void main2()
{
int a, b, n, m,i, arr[48];
while (cin >> a && cin >> b && cin >> n)
{
if (a >= 1 && a <= 1000 && b >= 1 && b <= 1000 && n >= 1 && n <= 100000000)
{
m = n;
arr[1] = 1;
arr[2] = 1;
for (i = 3; i < 48; i++)
arr[i] = ((a * arr[i - 1] + b * arr[i - 2]) % 7);
cout << arr[m] << endl;
}
else if (a == b == n == 0)
break;
}
}
指针_超内存
#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;
}
最后优化
经过最后的优化,也不知道为什么把数组放到函数里进行调用,而放在main里面就进行不了
f(n)最多7*7=49种值,所以每给一次A,B都只要算前49个数,用f(n)等于前49个中的一个
using namespace std;
int f(int a, int b, int n);
int main()
{
int a, b, n;
while (cin >> a >> b >> n)
{
if (a == 0 && b == 0 && n == 0)
break;
cout << f(a, b, n) << endl;
}
return 0;
}
int f(int a, int b, int n)
{
int arr[50];
arr[1] = arr[2] = 1;
for (int i = 3; i < 50; i++)
{
arr[i] = (a * arr[i - 1] + b * arr[i - 2]) % 7;
}
if (n % 49)
return arr[n % 49];
else
return arr[1];
}