一个差生解1642Fibonacci 第 n 项

1642: 【例 2】Fibonacci 第 n 项

时间限制: 1000 ms         内存限制: 524288 KB
提交数: 70     通过数: 22
【题目描述】
大家都知道 Fibonacci 数列吧,f1=1,f2=1,f3=2,f4=3,…,fn=fn−1+fn−2f1=1,f2=1,f3=2,f4=3,…,fn=fn−1+fn−2 。

现在问题很简单,输入 nn 和 mm,求 fnmodmfnmodm。

【输入】
输入 n,mn,m。

【输出】
输出 fnmodmfnmodm。

【输入样例】
5 1000
【输出样例】
5
【提示】
数据范围与提示:

对于 100% 的数据, 1≤n≤2×109,1≤m≤109+101≤n≤2×109,1≤m≤109+10。

1642: 【例 2】Fibonacci 第 n 项

由于之前也做过几次Fibonacci数列问题,随手翻了下,看到了一本通网站1642:Fibonacci数列第n项。起初并没有注意这个题是在哪个章节,但看了一下题目,感觉不太难,然后就开始做了。上手后,再细看条件,“对于 100% 的数据, 1≤n≤2×10^9,1≤m≤10^9+10”,这很是要命啊,估计能做到O(n)的时间复杂度都怕是没戏。于是,得思考更高级的时间复杂度算法,初步想到的是O(logn),二分法就是最常见的O(logn)时间复杂度了。那我的想法就集中在f(n)与f(n/2)的关系上了。由于这个题边界条件是两个,f(1)=f(2)=1,估计要直接用f(n/2)表示f(n)是有难度的,还有n可能是一个奇数,也可能是偶数,所以我思考的方向是用两项表示两项:比如用f(3)、f(4)表示f(7)、f(8),再用f(7)、f(8)表示f(15)、f(16)等。为了方便验算,我先求了前面的部分项:f(3)=2,f(4)=3,f(5)=5,f(6)=8,f(7)=13,f(8)=21,f(9)=34,f(10)=55。f(3)=f(2)+f(1),f(4)=f(3)+f(2)=2f(2)+f(1),到这看不出什么特殊性,继续...,f(5)=f(4)+f(3)=2f(3)+f(2), f(6)=f(5)+f(4)=3f(3)+2f(2),有点眉目了,还不明显,再算:f(7)=3f(4)+2f(3),f(8)=3f(5)+2f(4),f(9)=3f(6)+2f(5),f(10)=3f(7)+2f(6),似乎看到f(n+3)=3f(n)+2f(n-1),但不是我们的目标,继续向下:f(8)=5f(4)+3f(3),f(9)=5f(5)+3f(4),f(10)=5f(6)+3f(5)=8f(5)+5f(4),这时可以看到“系数似乎也是数列是的项”,如果是这样,那f(7)=f(4)*f(4)+f(3)*f(3), f(9)=f(4)*f(4)+f(5)*f(5),再验证,没错。偶数呢?f(8)=f(5)*f(4)+f(3)*f(4)=(f(4)+f(3))*f(4)+f(4)*f(3)=f(4)*f(4)+2*f(4)*f(3),f(10)=f(5)*f(5)*2*f(5)*f(4),由此推广可知: f(2n+1)=f(n+1)*f(n+1)+f(n)*f(n),f(2n)=f(n)*f(n)+2*f(n)*f(n-1),二分法基本实现,至于证明,我就不做了,直接上网站提交就知道对大数是否成立了。

#include<iostream>
using namespace std;
long long const mxn=20000011;
long long n,m,a[mxn];
long long fb(long long n)
{
    if(n==1||n==2)return 1;
    if(n>=mxn){
        long long t1=fb(n/2)%m,t2;
        if(n%2)t2=fb(n/2+1)%m,t1=(t1*t1+t2*t2)%m;
        else t2=fb(n/2-1),t1=(t1*t1+2*t1*t2)%m;
        return t1;
    }
    else
    {
        if(a[n]==0)
        {
            long long t1=fb(n/2)%m,t2;
            if(n%2)t2=fb(n/2+1)%m,a[n]=(t1*t1+t2*t2)%m;
            else t2=fb(n/2-1),a[n]=(t1*t1+2*t1*t2)%m;
        }
        return a[n];
    }
}
int main()
{
    cin>>n>>m;
    cout<<fb(n);
    return 0;
 } 

1642源代码

提交到网站,嘿嘿,过了!

如有不妥,请指教。

后来才看了这一部分属于矩阵,然后拿书出来看了原书解答,真心不懂,需要花点时间去啃这块硬骨头了。

原文地址:https://www.cnblogs.com/wendcn/p/10548381.html

时间: 2024-10-06 02:40:34

一个差生解1642Fibonacci 第 n 项的相关文章

王金战:改变一个差生真的很简单

当一个学生,反复遭遇失败的打击,他就变成了差生,没有一个学生生下来就注定是个差生.所以让一个差生变好真的很简单.    我刚参加工作的时候,不敢说这句话,但是我现在敢说,因为我多年的经历已经证明了这件事情.让一个差生变好真的很简单,怎么做呢?就是反其道而行之.差生是反复遭遇失败的打击后才产生的,让一个差生变好,就是让他反复享受到成功的喜悦,这个学生就会慢慢地变好了.    少年来我就用这样的方法和理念,帮着一个个学生走出困境,走向成功.我深深体会到,作为教师,作为家长,要学会欣赏孩子.特别是对那

获取列表中某一个文件夹下的列表项集合(不包含子文件夹对象,也不包含子文件夹中的列表项)

RT,方法如下: 1 SPListItemCollection GetSubItemsWithoutFoldersInParrentFolder(SPFolder parrent) 2 { 3 SPList list = parrent.Item.ParentList; 4 SPQuery query = new SPQuery(); 5 query.Folder = parrent; 6 query.Query = "<Where><Eq><FieldRef Na

机器学习中使用「正则化来防止过拟合」到底是一个什么原理?为什么正则化项就可以防止过拟合?

原文:http://www.zhihu.com/question/20700829 27 个回答 46赞同反对,不会显示你的姓名 ALAN Huang,什么都会一点点 欣然.王志.马克 等人赞同 Orangeprince 的回答非常学院派,也非常系统. 过拟合表现在训练数据上的误差非常小,而在测试数据上误差反而增大.其原因一般是模型过于复杂,过分得去拟合数据的噪声和outliers. 正则化则是对模型参数添加先验,使得模型复杂度较小,对于噪声以及outliers的输入扰动相对较小. 以正则化项和

数据结构实践——“求两集合交集”的一个错解分析

本文点评一位学生对基于线性表存储集合,然后对集合进行求并运算的错解,供学习者參考. [项目 - 求集合并集] 如果有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员.设计算法.用函数unionList(List LA, List LB, List &LC )函数实现该算法,求一个新的集合C=A∪B.即将两个集合的并集放在线性表LC中. 提示: (1)除了实现unnionList函数外.还须要在main函数中设计代码,调用unionList进行測试

HDU2256&amp;&amp;HDU4565:给一个式子的求第n项的矩阵快速幂

HDU2256 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2256 题意:求(sqrt(2)+sqrt(3))^2n%1024是多少. 这个题算是hdu4565的一个常数版本了,所以我们先说这道题.对于这道题的做法我们可以计算((sqrt(2)+sqrt(3))^2)^n=(5+2*sqrt(6))^n,对于(5+2*sqrt(6))^n我们知道答案必定是以an+bn*sqrt(6),而对于下一项我们只需要求(an+bn*sqrt(6))*(5

win7系统的右键菜单只显示一个白色框不显示菜单项 解决办法

如上图所示,桌面或其他大部分地方点击右键菜单,都只显示一个白色框,鼠标移上去才有菜单项看,并且效果很丑 解决办法: 计算机-右键-属性-高级-性能-设置-视觉效果-淡入淡出或滑动菜单到视图,将其前面的复选框的钩去掉.

详解Oracle 12c九项数据库对象管理操作

简介 1.用户管理2.用户授权3.事务管理4.索引5.视图以及物化视图6.序列7.导入导出数据8.同义词9.分区表 实验环境 系统环境:centos7.4Oracle服务IP地址:192.168.100.99光盘挂载目录:/mnt/sr0安装相关目录:/opt 命令步骤 一.用户管理 1.登录Oracle数据库 [[email protected] ~]$ lsnrctl start #启动监听 [[email protected] ~]$ sqlplus / as sysdba SQL> st

(16)mongodb mapReduce分布式统计示例遇到的一个未解问题,求平均值不对,希望哪位大神给指点一下

mapReduce 的优势在于分布式,这一节记录一个分布式统计的示例,整个过程分为这几步:启动分布式服务.手动分片.导入数据.执行 mapReduce.下面单独说说这几步. 1.启动分布式服务 参考前面的第10节和第11节,不在重复说了. 2.手动分片: sh.enableSharding('test'); 用test库做分片 sh.shardCollection('test.dz',{sn:1}); 指定片键,test库的dz集合,sn为片键 mongos> for(var i=1;i<=8

一个使用maven创建的springmvc项目的pom.xml文件配置内容及介绍

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 htt