另类的斐波拉契问题
Time Limit: 1000 ms
Memory Limit: 65535 kB
Description
众所周知,斐波拉契序列有以下特性:
F[n] = F[n - 1] + F[n - 2] ( n >= 2);
现在,我们令F[0] = 5, F[1] = 13。
现在我们需判断F[n]是否能够被3整除。
Input
每行输入一个数n( 0 < n < 1,000,000,000 )。
Output
每个n对应输出一行,如果F[n]能被3整除,则输出"Yes",否则则输出"No"。
Sample Input
0
1
2
6
Sample Output
No
No
Yes
Yes
Source
因为被问及的是能否被3整除,那么很容易想到应该会有循环节。
我们假设f[1] = a, f[2] =b,同时我们也知道f[n]%3 = (f[n-1]+f[n-2])%3 = f[n-1]%3 + f[n-2] %3。
那么来尝试看看前几项:
(1):a%3 (2):b%3 (3):0
(4):b%3 ( 5):b%3 (6):(2*b)%3
(7):(3*b)%3=0 (8):(2*b)%3 (9):(2*b)%3
(10):(4*b)%3=b%3 (11:)(3*b)%3=0
所以从第三项开始,可以得知循环节为4,所以容易得到标程如下:
#include <cstdio>
int main()
{
int n;
FILE * fin, * fout;
fin = fopen("1.std.in", "r");
fout = fopen("1.std.out", "w");
while ( ~fscanf(fin, "%d", &n) )
{
fprintf(fout, "%s\n", ( n - 2 ) % 4 ? "No" : "Yes");
}
fclose(fin);
fclose(fout);
return 0;
}