ZZUOJ - 1241 - 斐波那契数

本文介绍了一种快速判断斐波那契数列中任意项是奇数还是偶数的方法,通过判断输入数字是否能被3整除来简化计算过程,避免了直接计算大数带来的复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

郑州大学第八届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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值