ZZUOJ - 1241 - 斐波那契数

郑州大学第八届ACM大学生程序设计竞赛正式赛

C.斐波那契数

Description

xq最近迷恋上了斐波那契数列,因为当n趋向于无穷大时,后一项与前一项的比值越来越逼近黄金分割0.618。不过令xq不开心的是,斐波那契数的增长速度太快了,以至于当n很大时,用计算机中的32位整数甚至64位整数都已经不能表示这个数了。基于这个原因,xq遇到了这个难题,xq想要知道第K(0<=K<=10^10000)项斐波那契数是奇数还是偶数,因为K太大了,xq不知道怎么解决这个问题,现在xq想让你解决这个问题。斐波那契数列是如下的一个数列,0,1,1,2,3,5……,其通项公式为F(n)=F(n-1)+F(n-2),(n>=2) ,其中F(0)=0,F(1)=1。

Input

第一行,T,表示有1<=T<100个测试样例。
接下来T行,每行一个数据K(0<=K<=10^10000),表示要判定的是哪一项。

Output

如果第K项是偶数,输出YES,否则输出NO。

Sample Input

2
0
1

Sample Output

YES
NO

思路:就是一道找规律题,把斐波那契数列列出来后会发现,序号只要是3的倍数就是偶数,那题目就变成了判断给的数字是不是3的倍数,题目给的10^10000,这其中有一个小结论,如果一个很大的数字,把它的各个位数相加如果是三的倍数,那么这个数就是3的倍数,一下子题目就简单躲了


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main() {
    int t;
    scanf("%d", &t);
    while(t--){
        char str[10010];
        scanf("%s", str);
        int len = strlen(str);
        int sum = 0;
        for(int i = 0; i < len; i++){
            sum += str[i]-'0';
        }
        if(sum%3 == 0)  printf("YES\n");
        else    printf("NO\n");
    }
    return 0;
}

你可能感兴趣的:(找规律,zzuoj)