- 思路
- 基本思路:穷举每一个值,直到f(n),但是这样会遇到Time Limit Exceeded
- 找规律:自己动手计算了一些值后发现值按一定周期循环,那么只要找到周期就可以大量减少计算时间。只要找到某两个值f(i-1), f(i)与前面的某两个值f(j-1), f(j),使得
f(i-1)==f(j-1)
且f(i)==f(j)
,那么,我们就找到了周期T=i-j
- 注意:
周期并不一定是从f(0)开始,也可能是从中间的某个值开始,所以无论计算周期还是计算f(n)的值都要考虑周期的起始位置f(j-1),此处易坑……
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int A, B, n;
vector<int> f;
while (1)
{
cin >> A >> B >> n;
if (A == 0 && B == 0 && n == 0)
{
exit(0);
}
if (n == 1 || n == 2)
{
cout << "1" << endl;
}
else
{
f.clear();
f.push_back(1);
f.push_back(1);
int i, j, T = 0;
for (i = 2; i < n; i++)
{
f.push_back((A*f[i - 1] + B*f[i - 2]) % 7);
//cout << f[i] << endl;
for (j = 1; j < i; j++)
{
if (f[i] == f[j] && f[i - 1] == f[j - 1])
{
T = i - j;
//cout <<"T: "<< T << endl;
break;
}
}
if (T)
break;
}
if (T)
{
cout << f[((n-1)-(j-1))%T+(j-1)] << endl;
}
else
{
cout << f[n-1] << endl;
}
}
}
return 0;
}
?
时间: 2024-11-02 10:40:41