我是个没有耐心的人,曾经玩过acm,不过感觉太无聊就没在继续,现在趁学校有专门开这个课,就把它继续下去,当年没解决的好多题目现在都能够懂了,比如说这个,当年就是在这个题解不出并且看不懂别人的结题报告以后放弃的(最主要的是代码简洁的太销魂)。现在来详细解释一番,希望自己记住并对ACM新手有所帮助(加油啊,各位)。
Fibonacci Again
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 40 Accepted Submission(s) : 21
Problem Description
There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2).
Input
Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000).
Output
Print the word "yes" if 3 divide evenly into F(n).
Print the word "no" if not.
Print the word "no" if not.
Sample Input
0 1 2 3 4 5
Sample Output
no no yes no no no
Author
Leojay
刘春英老师PPT的提示:
能被3整除的整数的特点?
如果两个数的和能被3整除,这两个数有什么特点?
关于“和”能否被3整除,这两个数一共有多少种组合?
会不会出现某连续两项和后面连续两项相等的情况?如果出现,能得到什么信息?
可以先思考一下上面的问题,(上课这个都是跳过的,我都没怎么懂)
解析:
有个很重要的公式f(n)%3=(f(n-1)%3+f(n-2)%3)%3
这个公式带几个数字进去就可以理解了,我也就不多说了
一般n的数值可以取到如此之大可以见得一定有规律
先列个表吧
n 0 1 2 3 4 5 6 7 8 9
f(n) 7 11 18 29 47 76 123 199 322 521
f(n)%3 1 2 0 2 2 1 0 1 1 2
现在要找出其中的规律
因为斐波那契数是n位置的数等于它前面的两个数之和,
再运用上面的公式可以得到n位置的数除以3的余数等于前面两个数除以三的余数再除以三
所以f(n)%3那行只要重复出现1,2就表明已经重复了(后面那个数都是n=2和n=10都是(1+2)%3,同理可得后面的值都依次重复下去)
有些人会说万一规律在100次以后出现那不是惨了,
其实不是因为3的余数只有0,1,2,排列组合一些只有9种可能,因此规律在9次以后一定出现
如果类似的题目数值实在太大就只能写一段程序去寻找规律了。
根据表可以看出每8次循环一次,因此n%8=2或者6的时候值可以被3整除。
现在看一下代码,是否就一目了然了呢
#include<stdio.h>
int main()
{
long n;
scanf("%ld",&n) ;
if (n%8==2 || n%8==6)
printf("yes\n");
else
printf("no\n");
return0;
}