hdu 1005(找规律--循环节)

本文介绍了一种通过寻找数列循环节的方法来高效解决特定类型的数列递推问题。利用该方法可以避免冗长的递推计算过程,适用于求解形如 f(n) = (A*f(n-1) + B*f(n-2)) % 7 的数列问题。

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

题目链接:点击打开链接

题目大意:A number sequence is defined as follows:

f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

Given A, B, and n, you are to calculate the value of f(n).


题目分析:一般数学题:1.结论问题;

                                            2.递推

                                            3.打表找规律

                    这道题之前还去用过递推,解方程,但是由于f【n】和F【n-1】等是有关系的,所以完全可以找循环节(即前后连着的与某个位置的前后两个位置相同这一定是循环节),再则相邻2个数之间的搭配(7*7=49 )种,所以完全不用担心循环节的长度


题目总结:姿势要优美,一般正确的代码一定是简洁干净的


#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
int f[105];
int main()
{
    int a,b,n,flag=1,i,j,start,end;
    while(1)
    {
        scanf("%d%d%d",&a,&b,&n);
        if(!a||!b||!n)
            break;
        f[1]=f[2]=1;
        flag=0;
        for(i=3; i<=n&&!flag; i++)
        {
            f[i]=(a*f[i-1]+b*f[i-2])%7;
           // printf("n:%d %xbd\n",i,f[i]);
            for(j=2; j<i-1; j++)
            {
                if(f[j]==f[i]&&f[j-1]==f[i-1])
                {
                    flag=1;start=j,end=i;
                    break;
                }
            }

        }
        if(flag)
            n=(n-start)%(end-start)+start;
        printf("%d\n",f[n]);
        }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值