HDU 1005 Number Sequence(循环节) *

本文介绍了一个计算模7下斐波那契数列周期性的算法,通过限制输入范围并利用循环特性,可以在O(50)的时间复杂度内解决一般问题。该方法适用于竞赛编程中涉及斐波那契数列及其变化的问题。

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

思路来自:http://blog.sina.com.cn/s/blog_a16dd6d101014pjy.html

因为首先,任意一个数mod7结果为0到6这7个值,两个数就有7*7种组合

所以只要计算50此肯定会有个循环

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cmath>
#include <sstream>
#include <vector>
using namespace std;
#define REP(i,a,b) for(int i=a;i<(int)b;i++)
#define REPD(i,a,b) for(int i=a;i>=(int)b;i--)

int f[50+5];
int main()
{
    int a, b;
    int n, i;
    while(1)
    {
        memset(f, 0, sizeof(f));
        scanf("%d%d%d", &a, &b, &n);
        if(a==0 && b==0 && n == 0) break;
        f[0] = f[1] = 1;
        if(n == 1 || n ==2 )
        {
            printf("1\n");
            continue;
        }
        for(i = 2; i<50; i++)
        {
            f[i] = (a * f[i-1] + b * f[i-2])% 7;
            if(f[i-1] == 1 && f[i-2] == 1 && i != 2  )  break;    
        }
        printf("%d\n",f[(n-1)%(i-2)]);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值