傻牛的递推数列(数论,斐波那契)

题目描述

傻牛最近钻研各类数学递推数列。尤其是斐波那契数列。
傻牛眼中的斐波那契数列是这样的,F1=1,F2=1,然后Fi+2=Fi+1 + Fi,逐项递推。
今天,傻牛发现,某些斐波那契项之间是成倍数关系的。例如第4项F4=3和第8项F8=21。傻牛想知道,对于某一项Fx,求所有满足Fx是Fi倍数的i的和是多少?
数据范围:x小于等于1e6,数据组数小于等于1e5

题目分析

斐波那契数列是一个神奇的东西
首先我们 打表可知 证明一个结论:

预备结论

1.斐波那契数列第i项和第i-1项互质(显然)
2. Fi=FxFix+1+Fx+1Fix
第二条怎证明呢?很简单:
首先 Fi=F1Fi2+F2Fi1 是显然的对不对?
F2=F1+F0 , Fi3=Fi2Fi4 , F3=F2+F1 , Fi2=Fi1Fi3 是的吧。
我们把这个式子 F2Fi3+F3Fi2 变形并化简得到:

F1Fi2+F2Fi1+(F0Fi2F1Fi4F0Fi4F2Fi3F1Fi3+F1Fi1)

如果式子被吞了请打开图片查看。
好的,前面的就不看了,现在我们想想怎么搞掉括号里的,只看括号,由于 F0=0 ,然后再合并合并可得:
F1Fi1F2Fi3F1(Fi4+Fi3)

啊啊, Fi4+Fi3 是什么? Fi2 啊!
F1(Fi1Fi2)F2Fi3

Fi1Fi2 是什么? Fi3 啊!
所以:
(F1F2)Fi3

F1F2 等于0吧?后面的括号被我们搞掉了!继续改变x的值的方法也差不多,就是合并的步骤多一些。

开始推导

好,对于n(n大于2):
假设 Fm=Fmn+1Fn+FmnFn+1
首先由预备结论第一条, Fn Fn+1 是互质的对吧?
那么如果 Fm Fn 的倍数,那么 Fmn Fn 的倍数
Fn Fn 的倍数,要使 Fmn Fn 的倍数,第一个这样的 m 2n,第二个就是 3n 了,以此类推。
因此我们得到了做这题的方法:求题目给出的x的所有约数和即可。注意如果这个数是奇数,还要加个2(因为 F2=1
然而考试时我是打表得到这些结论的,所以这题还是hin水的对吧

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;
#define LL long long
int ans[1000005];int n;
int main()
{
    freopen("sequence.in","r",stdin);
    freopen("sequence.out","w",stdout);
    for(int i=1;i<=1000000;i++)ans[i]=3;
    for(int i=3;i<=1000000;i++)
        for(int j=i;j<=1000000;j+=i)ans[j]+=i;
    while(scanf("%d",&n)!=EOF)printf("%d\n",ans[n]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值