P1306 斐波那契公约数

题目描述

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

输入输出格式

输入格式:

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

注意:数据很大

输出格式:

Fn和Fm的最大公约数。

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

输入输出样例

输入样例#1:

4 7

输出样例#1:

1

说明

用递归&递推会超时

用通项公式也会超时


前置芝士

矩阵快速幂,更相减损术,欧几里得算法。

思路

初看此题,毫无头绪,其实并不难。

结论很简单,设\(f[i]\)表示斐波那契数列第\(i\)个,则有\(\gcd(f[i],f[j])=f[\gcd(i,j)]\)。

为什么呢?

显然,当\(i=j\)时,结论成立。

假设\(i<j\),我们设\(f[i]=a,f[i+1]=b,f[i+2]=a+b...\)

很明显,\(f[j]=f[j-i]\times b+f[j-i-1]\times a\)

因此\(\gcd(f[i],f[j])=\gcd(f[i],f[j-i]\times f[i+1]+f[j-i-1]\times f[i])\)

即\(\gcd(f[i],f[j])=\gcd(f[i],f[j-i]\times f[i+1])\)

引理:\(\gcd(f[i],f[i+1])=1\)

证明:

显然,\(\gcd(f[1],f[2])=1\)成立。

\(\gcd(f[2],f[3])=\gcd(f[2],f[3]-f[2])=\gcd(f[2],f[1])=1\)

\(\gcd(f[3],f[4])=\gcd(f[3],f[4]-f[3])=\gcd(f[3],f[2])=1\)

...

QED.

回到\(\gcd(f[i],f[j])=\gcd(f[i],f[j-i]\times f[i+1])\)这个式子,因为\(\gcd(f[i],f[i+1])=1\),因此\(\gcd(f[i],f[j])=\gcd(f[i],f[j-i]\times f[i+1])=\gcd(f[i],f[j-i])\)

发现了吧?这和更相减损术的\(\gcd(i,j)=\gcd(i,i-j)\)蜜汁相似,没错,就是公约数!\(\gcd(f[i],f[j])\)就等于\(f[\gcd(i,j)]\)!

然后用矩阵快速幂求出\(f[\gcd(n,m)]\)即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define Re register int N, M; int gcd( int x, int y ){ return y ? gcd( y, x % y ) : x; } int a[3][3], b[3][3], c[3][3]; inline void Times( int a[3][3], int b[3][3] ){
memset( c, 0, sizeof c );
for ( int i = 1; i <= 2; ++i )
for ( int k = 1; k <= 2; ++k )
for ( int j = 1; j <= 2; ++j )
c[i][j] = (int)( ( c[i][j] + 1ll * a[i][k] * b[k][j] ) % 100000000 );
} int main(){
scanf( "%d%d", &N, &M );
N = gcd( N, M ) - 2;
if ( N <= 0 ){ printf( "1\n" ); return 0; }
a[1][1] = a[1][2] = b[1][1] = b[1][2] = b[2][1] = 1;
for ( int i = N; i; i >>= 1 ){
if ( i & 1 ) Times( a, b ), memcpy( a, c, sizeof a );
Times( b, b ), memcpy( b, c, sizeof b );
}
printf( "%d\n", a[1][1] );
return 0;
}

「洛谷P1306」斐波那契公约数 解题报告的更多相关文章

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

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

  2. 「洛谷P2397」 yyy loves Maths VI (mode) 解题报告

    P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ...

  3. 洛谷——P1349 广义斐波那契数列

    题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入输出格 ...

  4. 【洛谷P1962】斐波那契数列

    斐波那契数列 题目链接:https://www.luogu.org/problemnew/show/P1962 矩阵A 1,1 1,0 用A^k即可求出feb(k). 矩阵快速幂 #include&l ...

  5. 洛谷P1349 广义斐波那契数列(矩阵快速幂)

    P1349 广义斐波那契数列 https://www.luogu.org/problemnew/show/P1349 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定 ...

  6. 洛谷——P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如$an=p\times a_{n-1}+q\times a_{n-2}$?的数列.今给定数列的两系数$p$和$q$,以及数列的最前两项 ...

  7. 【剑指Offer】10- I. 斐波那契数列 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 递归 动态规划 日期 题目地址:htt ...

  8. 洛谷P1349 广义斐波那契数列

    传送门 话说谁能告诉我矩阵怎么用latex表示…… 差不多就这样 //minamoto #include<iostream> #include<cstdio> #include ...

  9. hdu4549_M斐波那契数列 解题报告

    Solution: 1.快速幂:数/矩阵 2.以证明1000000007是素数. 费马小定理: 若p是素数,gcd(a,p)=1,则a^(p-1)1(mod p). 若a^b mod p 中b很大,则 ...

随机推荐

  1. C++第三次作业:友元类

    友元类 将数据与处理数据的函数封装在一起,构成类,即实现了数据的共享又实现了隐藏,无疑是面向程序设计的一大优点,但是封装并不总是完美的,一旦需要涉及到一个类的两个对象的数据处理问题该怎么办?无论是设计 ...

  2. hdu 4476 Cut the rope (2-pointer && simulation)

    Problem - 4476 题意是,给出若干绳子,对同一根绳子只能切割一次,求出最多能获得多少长度相同的绳子. 代码中,s是最大切割长度,而当前切割长度为t/2. 代码如下: #include &l ...

  3. C#的循环语句(一)

    循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变.for(初始条件;循环条件;状态改变) {循环体} for 格式: for(int i=1/*初始条件*/;0<=10 ...

  4. laravel 常用文档

    [ Laravel 5.6 文档 ] 快速入门 —— 目录结构  laravel学院 http://laravelacademy.org/post/8657.html Laravel 的缓存系统    ...

  5. Pandas库之DataFrame

    Pandas库之DataFrame 1 简介 DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表. 或许说它可能有点像matlab的矩阵,但是matlab ...

  6. C# Thread.Join();Thread.Abort();

    Join() 等待当前线程运行完成后,才继续执行主线程后续代码: Abort() 结束当前线程,继续执行主线程后续代码: Thread.Join(); static void Main(string[ ...

  7. [POJ2528]Mayor's posters(离散化+线段树)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 70365   Accepted: 20306 ...

  8. POJ2763 Housewife Wind 树链剖分 边权

    POJ2763 Housewife Wind 树链剖分 边权 传送门:http://poj.org/problem?id=2763 题意: n个点的,n-1条边,有边权 修改单边边权 询问 输出 当前 ...

  9. 获取active nn并替换hue.ini

    namenodelists="nnip1,nnip2" nn1=$() nn2=$() nn1state=$(curl "http://$nn1:50070/jmx?qr ...

  10. 将 using namespace 写在函数体中,以避免命名空间冲突

    将 using namespace xxx 写在函数体中时, 命名空间 xxx 中定义的资源只在该函数体中有效. 测试代码如下图所示(namespace std 只在函数 testFun2 中有效):