#include<stdio.h>
int main(void)
{
    int f0 = 7, f1 = 11, j = 0;
    int a[10];
    
    for(int i = 0; i < 10; i++)
    {
        a[j] = (f0+f1)%3;
        f0 = f1;
        f1 = a[j++];
    }
    for(int i = 0; i < 10; i++)
        printf("%d ", a[i]);
    
    return 0;
}
输出结果:0 2 2 1 0 1 1 2 0 2。容易看出,循环周期为8,而从第一个数起每隔三个数0便出现一次。
因此,容易写出以下代码:
#include<stdio.h>
int main(void)
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        if((n-2)%4 == 0)
            printf("yes\n");
        else
            printf("no\n");
            
    }
    return 0;
}
当然,与HDU_1005不同的是,本题的数列的每项是确定的,因此可以打表通过:
#include<stdio.h>
#define MAXN 1000000
int a[MAXN+10];
int main(void)
{
    a[0] = 7;
    a[1] = 11;
    int n;
    for(int i = 2; i <= 1000000; i++)
    {
        a[i] = (a[i-1] + a[i-2]) % 3;
    }    
        
    while(scanf("%d", &n) != EOF)
    {
        if(a[n] == 0)
            printf("yes\n");
        else
            printf("no\n");
    }
    
    return 0;
}
或许HDOJ系统测试强度不够吧,这题暴力破解都可以通过:
#include<stdio.h>
int main(void)
{
    int f0 = 7, f1 = 11, j = 0, f2;
    int a[10];
    int n;
    while(scanf("%d", &n) != EOF)
    {
        f0 = 7;
        f1 = 11;
        for(int i = 2; i <= n; i++)
        {
            f2 = (f0 + f1) % 3;
            f0 = f1;
            f1 = f2;
        }    
        
        if(n == 0 || n == 1)
            printf("no\n");
        else if(f2 == 0)
            printf("yes\n");
        else
            printf("no\n");
    }
    
    return 0;
}
另外,打表的时候要注意,该题不mod3的话,也就是直接存入每项的具体值,然后直接取出求模的方式是不可取的,因为对于1, 1开头的斐波那契数列的第四十余项int类型已经存不下了(可以写个程序测试),这是因为斐波那契数列以接近0.618为底的指数增长。指数可是会爆炸的啊:~
原文:http://www.cnblogs.com/xpjiang/p/4412338.html