HDU 1005 Number Sequence

本文介绍了一种解决斐波那契数列%7问题的方法,通过寻找循环节缩短计算过程。使用矩阵乘法和特定的循环特性,解决了大数据量下的计算效率问题。

2012、10、30 来到IMUT快两个月了,才发现自己真的该好好学习算法了,或许还不算晚!加油~~

这道题 囧了好久,原因两个:1、矩阵乘法现在也不会构造 2、不会寻找循环节

今天呢,心血来潮学了下如何找循环节,看来感觉还不错,没有想象中的那么难。

其实这道题就是斐波那契数列 % 7的简单题,但因为数据量比较大,所以要用到矩阵。

但既然是 % 7那就是有循环节的。

我们大致的估算下0--6 7个数字,按照组合数学的思想最多有49种组合,所以i<50就足够了。

有时间 再想想矩阵怎么建立。。。真心弱爆了。

直接贴代码:

#include<iostream>
#include<cstdio>
using namespace std;
int a,b,n,i;
int f[1000000]={0,1,1};
int main(){
    while(~scanf("%d%d%d",&a,&b,&n)&&a+b+n){
    for(i=3;i<=50;i++){
    f[i]=(a*f[i-1]+b*f[i-2])%7;
    if(f[i]==1&&f[i-1]==1) break;}
     //如果有两个连着 =1,则后面的全部和前面相同,即出现了周期
     //这时就没必要再进行下去了,跳出循环, i-2为周期
    n=n%(i-2);
     //把n对周期求模,当n = i-2时, n=0,此时本来应该取arr[i-2]的,所以把arr[0]=arr[i-2]
     //也可以这样:
     //if(n==0) n=i-2;
    f[0]=f[i-2];
    cout<<f[n]<<endl;}
    return 0;
}
//自己编写个找循环节的程序 找到第1个便是15循环节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值