hdu 1005 Number Sequence

本文介绍了一种利用循环节解决特定数列问题的方法。通过给定的递推公式f(n)=(A*f(n-1)+B*f(n-2))%7,分析了数列的周期性质,并提供了一个高效的算法实现方案。

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

(1)类型:查找规律之循环节
(2)题意:有多组测试实例,每组测试数据中有A,B,n三个整数,当A=B=n=0时结束执行。给你一个数组的前两个数,以后的每项遵循公式f(n)=(A*f(n-1)+B*f(n-2)%7。
(3)解题总结:乍一看,哇,好简单的题目,再一看,哇,n那么大肯定不是那么简单的。后来就get到了点,原来它是一个循环节。因为A和B是固定的,那f数组长度至多为49。只要这一个标志结束就好了,但是%运算是个神奇的运算,在提交的过程中,自己一度以为自己的代码写错了。因为打个比方,如果数组长度为4,4%8=4,但是4%4=0,这就出现了bug。
(4)提交详情:简单的被我写成了这样.jpg
(5)自己的代码:

#include<iostream>
using namespace std;
const int MAX_N=1e2+6;
int a,b,n,f[MAX_N];
void  solve(){
    int i;
    f[1]=1;f[2]=1;
    for(i=3;i<51;i++){
        f[i]=(a*f[i-1]+b*f[i-2])%7;
        if(f[i]==1&&f[i-1]==1&&i!=3)break;
    }
    n%=(i-2);
    if(n==0)cout<<f[i-2]<<endl;
    else cout<<f[n]<<endl;
}
int main(){
    ios::sync_with_stdio(false);cin.tie(0);
    while(cin>>a>>b>>n,a,b,n)solve();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值