题目描述

对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少?

输入输出格式

输入格式:

两个正整数n和m。(n,m<=10^9)

注意:数据很大

输出格式:

Fn和Fm的最大公约数。

由于看了大数字就头晕,所以只要输出最后的8位数字就可以了。

输入输出样例

输入样例#1:

4 7
输出样例#1:

1

说明

用递归&递推会超时

用通项公式也会超时

Solution:

  本题其实并不难,开始被题意吓到了,结果后面写出了式子都没看出来(手动滑稽~)。

  方法:结论+矩阵加速

  结论:$$gcd(F[n],F[m])=F[gcd(n,m)]$$

  证明:

  我们设$n<m$,$F[n]=a$和$F[n+1]=b$。

  则$F[n+2]=a+b,F[n+3]=a+2b,…F[m]=F[m-n-1]a+F[m-n]b$

  $\because \quad$ $F[n]=a,F[n+1]=b,F[m]=F[m-n-1]a+F[m-n]b$

  $\therefore \quad$ $F[m]=F[m-n-1]*F[n]+F[m-n]*F[n+1]$

  又$\because \quad$ $gcd(F[n],F[m])=gcd(F[n],F[m-n-1]*F[n]+F[m-n]*F[n+1])$

  而$F[n]|F[m-n-1]*F[n]$

  $\therefore \quad gcd(F[n],F[m])=gcd(F[n],F[m-n]*F[n+1])$

  引理:$gcd(F[n],F[n+1])=1$

   证:由欧几里德定理知

     $gcd(F[n],F[n+1])=gcd(F[n],F[n+1]-F[n])$

$=gcd(F[n],F[n-1])$

            $=gcd(F[n-2],F[n-1])$

            $……$

            $=gcd(F[1],F[2])=1$

      $\therefore \quad gcd(F[n],F[n+1])=1$

  由引理知:

  $F[n],F[n+1]$互质

  而 $gcd(F[n],F[m])=gcd(F[n],F[m-n]*F[n+1])$

  $\therefore \quad$ $gcd(F[n],F[m])=gcd(F[n],F[m-n])$

  即$gcd(F[n],F[m])=gcd(F[n],F[m\;mod\;n])$

  继续递归,将$m1=m\;mod\;n$,则$gcd(F[n],F[m])=gcd(F[n\;mod\;m1],F[m1])$

  $…$

  不难发现,整个递归过程其实就是在求解$gcd(n,m)$

  最后递归到出现$F[0]$时,此时的$F[n]$就是所求gcd。 

  $$\therefore \quad gcd(F[n],F[m])=F[gcd(n,m)]$$

  于是本题就转为求$gcd(n,m)$,然后求斐波拉契数列的$F[gcd(n,m)]$项后8位(即对100000000取模)。

  至于矩阵的构造:

  初始矩阵 \begin{bmatrix} F[2]=1 & F[1]=1\end{bmatrix} 以及中间矩阵 \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define mem(p) memset(&p,0,sizeof(p))
using namespace std;
const ll mod=1e8;
ll n,m;
struct mat{ll a[][],r,c;};
il mat mul(mat x,mat y)
{
mat p;
mem(p);
for(int i=;i<x.r;i++)
for(int j=;j<y.c;j++)
for(int k=;k<x.c;k++)
p.a[i][j]=(p.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
p.r=x.r,p.c=y.c;
return p;
}
il void fast(ll k)
{
mat p,ans;
mem(p),mem(ans);
p.r=p.c=;
p.a[][]=p.a[][]=p.a[][]=;
ans.r=,ans.c=;
ans.a[][]=ans.a[][]=;
while(k)
{
if(k&)ans=mul(ans,p);
p=mul(p,p);
k>>=;
}
cout<<ans.a[][];
}
il ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
int main()
{
ios::sync_with_stdio();
cin>>n>>m;
n=gcd(n,m);
if(n<=)cout<<;
else fast(n-);
return ;
}

P1306 斐波那契公约数的更多相关文章

  1. 洛谷 P1306 斐波那契公约数

    洛谷 P1306 斐波那契公约数 题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? ...

  2. 洛谷 P1306 斐波那契公约数 解题报告

    P1306 斐波那契公约数 题意:求\(Fibonacci\)数列第\(n\)项和第\(m\)项的最大公约数的最后8位. 数据范围:\(1<=n,m<=10^9\) 一些很有趣的性质 引理 ...

  3. 洛谷——P1306 斐波那契公约数

    P1306 斐波那契公约数 题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? 输入输 ...

  4. 洛谷- P1306 斐波那契公约数 - 矩阵快速幂 斐波那契性质

    P1306 斐波那契公约数:https://www.luogu.org/problemnew/show/P1306 这道题目就是求第n项和第m项的斐波那契数字,然后让这两个数求GCD,输出答案的后8位 ...

  5. Luogu P1306 斐波那契公约数

    这道题其实是真的数学巨佬才撸的出来的题目了 但如果只知道结论但是不知道推导过程的我感觉证明无望 首先这道题肯定不能直接搞,而且题目明确说明了一些方法的问题 所以就暗示我们直接上矩阵了啦 但是如果直接搞 ...

  6. 【Luogu】P1306 斐波那契公约数 题解

    原题链接 嗯...很多人应该是冲着这个标题来的 (斐波那契的魅力) 1.分析题面 点开题目,浏览一遍题目,嗯?这么简单?还是蓝题? 再看看数据范围,感受出题人深深的好意... \(n,m \leq 1 ...

  7. 洛谷P1306 斐波那契公约数

    题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? 输入输出格式 输入格式: 两个正整 ...

  8. 【luogu P1306 斐波那契公约数】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1306#sub gcd(f[m],f[n]) = f[gcd(m,n)] #include <iostr ...

  9. P1306 斐波那契公约数(ksm+结论)

    题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? Update:加入了一组数据. 输 ...

随机推荐

  1. UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)

    题目描写叙述: 定义合法的括号序列例如以下: 1 空序列是一个合法的序列 2 假设S是合法的序列.则(S)和[S]也是合法的序列 3 假设A和B是合法的序列.则AB也是合法的序列 比如:以下的都是合法 ...

  2. mac brew update 报错

    环境为mac, 总共报了三种错误. 对应三种不同的解法. 1.   第一种如下, 提示 1.8 的版本找不到 $ brew update /usr/local/bin/brew: /usr/local ...

  3. 【Qt】窗口居中显示

    w.move((a.desktop()->width() - w.width())/, (a.desktop()->height() - w.height())/); 上述方法可以置中,但 ...

  4. SCRUM 12.22

    周一,大家现在课程也比较少,今天都在非常努力地写代码. 任务分配如往常一样,我们现在基本将工作的重心放在完善已有的组件上. 成员 任务 彭林江 落实API 牛强 落实意见反馈功能测试 高雅智 测试已完 ...

  5. 软件工程项目之摄影App(第二次冲刺)

    第二次冲刺阶段做出了登录,还有首页.基本界面也成型了. 登录验证码是用了mob的验证码skd.

  6. 转角遇见——Software

    第一部分:结缘计算机 从五岁开始读书,懵懵懂懂,从小就听长辈们说一定要考一个好大学,高三老师们就更是说:“过了高考,人生就无忧了”.于是似乎,高考就好像是我自出生以来这么多年的唯一愿景.高考成绩下来后 ...

  7. String系列-----AbstractStringBuilder

    1. AbstractStringBuilder是StringBuffer和StringBuilder的父类 package com.amazing.jdk.string_2017_12_31; im ...

  8. DockerHub使用简介

    常用的Docker镜像文件都有,就不用自己费劲的一点点配置了,这才是Docker的真正目的.就像Ghost里边含office,直接还原,不用一台台机器安装呢,省时省力,与高效工作的理念相契合. 至于, ...

  9. Wshshell 脚本简单学习

    WshShell 的简单语法 学习 同事给了一个脚本自动执行  部署命令 感觉挺好的 , 年前一直说要学习一下 但是一直没有学习(自己太懒了) 这次简单总结一下. 创建对象: Set WshShell ...

  10. SQLserver 一种简单的GUI方式创建DBlink copy 表数据的方法

    1. 在sqlserver 上面使用GUI的方式创建dblink 首先打开查询分析器 在如下的位置处右键 -新建连接服务器 输入需要copy数据的服务器 输入ip地址 然后建立连接 在打开查询分析器进 ...