题目描述

对于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. 创建一个Scalar-valued Function函数来实现LastIndexOf

    昨天有帮助网友解决的个字符串截取的问题,<截取字符串中最后一个中文词语(MS SQL)>http://www.cnblogs.com/insus/p/7883606.html 虽然实现了, ...

  2. 用c#开发微信 系列汇总 - z

    http://www.cnblogs.com/txw1958/ http://www.cnblogs.com/fengwenit/p/4505062.html

  3. mysql 自增长

    auto_increment_increment=10;      #自增量每次增加的值改为10, auto_increment_offset=2;             #第一次加载数值时的偏移值 ...

  4. C# 队列和栈 线程安全

    队列是其元素以先进先出(FIFO)的方式来处理集合,先入队的元素会先读取. 栈是和队列非常类似的另一个容器,栈和队列最大的区别是后进先出(LIFO),也可以说成先进后出. 队列在现实生活中的例子数不胜 ...

  5. flask-socketio笔记

    Flask-SocketIO使Flask应用程序可以访问客户端和服务器之间的低延迟双向通信. 客户端应用程序可以使用Javascript,C ++,Java和Swift中的任何SocketIO官方客户 ...

  6. python基础学习笔记(十)

    魔法方法.属性 ------------------------ 准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Objec ...

  7. 对于VS软件的个人评价

    因为还是一个菜鸟,对于VS这样的大软件还只能是自己个人的理解,以前用的是VC++,后来因为电脑系统更新,开始接触了VS,个人觉得还是vs2010更好用一些,作为一款windows平台应用程序的集成开发 ...

  8. beta阶段测试基本概况报告

    文件地址 测试基本信息                                                                                Bitmap 测试 ...

  9. VIM编辑器常用命令(转)

    转自:https://www.cnblogs.com/Nice-Boy/p/6124177.html

  10. Distances to Zero CodeForces - 803B (二分)

    题目链接:https://vjudge.net/problem/CodeForces-803B#author=0 题意: 给你一个数组,其中至少包括一个0,求每一个元素距离最近一个0的距离是多少. 样 ...