【Luogu】P1306 斐波那契公约数 题解
嗯...很多人应该是冲着这个标题来的
(斐波那契的魅力)
1.分析题面
点开题目,浏览一遍题目,嗯?这么简单?还是蓝题?
再看看数据范围,感受出题人深深的好意...

\(n,m \leq 10^9\)
就算加上矩阵快速幂,\(fib[1000000000]\) 也不是高精度能存的下的。
所以,我们得想一点技巧。
2.寻找思路
深呼吸,思考学过的斐波那契数列的性质...(???)
......
终于,它出现了!
\(gcd(fib[x],fib[y])=fib[gcd(x,y)]\)
怎么证呢?
证明:先证明斐波那契数列相邻两项是互素的。
反证法。若不互素,设\(x=gcd(fib[i],fib[i-1]),x>1\)
则\(x|fib[i],x|fib[i-1]\)
又因为\(fib[i-2]=fib[i]-fib[i-1]\)
所以\(x|fib[i-2]\)
一直往前推,直到\(x|fib[2]\)
又因为\(fib[2]=1\)
所以\(x=1\),矛盾!
接着,证明\(fib[n]=fib[m] fib[n-m+1]+fib[m-1] fib[n-m]\)
\(fib[n]=fib[n-1]+fib[n-2]\)
\(fib[n]=2fib[n-2]+fib[n-3]\)
\(fib[n]=3fib[n-3]+2fib[n-4]\)
...
\(fib[n]=fib[m] fib[n-m+1]+fib[m-1] fib[n-m]\)
最后,来到了对原公式的证明:
\(gcd(fib[x],fib[y])\)
\(=gcd(fib[y]fib[x-y+1]+fib[y-1]fib[x-y],fib[y])\)
\(=gcd(fib[x-y],f[y])\)(因为\(fib[y-1]\)与\(fib[y]\)互质)
以此递推下去,得:
\(=gcd(fib[x mod y],f[y])\)
这不是辗转相除吗?以此类推,最后会得到:
\(=gcd(fib[0],fib[gcd(x,y)])\)
\(=fib[gcd(x,y)]\)
呼,总算证完了~~
接下来,求\(fib[i]\),应该不要多讲了吧?矩阵快速幂就行了啊!
没学过的同学看这里:矩阵快速幂(原理+模板)
3.代码实现
终于来到了code time了呢~~
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod=1e8;
struct Matrix{
long long matrix[105][105];
int x,y;
Matrix(const long long a[105][105],int xx,int yy){
for(int i=1;i<=xx;i++){
for(int j=1;j<=yy;j++){
matrix[i][j]=a[i][j];
}
}
x=xx,y=yy;
}
Matrix(int fill,int xx,int yy){
for(int i=1;i<=xx;i++){
for(int j=1;j<=yy;j++){
matrix[i][j]=fill;
}
}
x=xx,y=yy;
}
Matrix(){
x=y=0;
memset(matrix,0,sizeof(matrix));
}
Matrix operator*(const Matrix& a) const{
Matrix ans;
for(int i=1;i<=x;i++){
for(int j=1;j<=a.y;j++){
ans.matrix[i][j]=0;
for(int k=1;k<=y;k++){
ans.matrix[i][j]+=matrix[i][k]*a.matrix[k][j];
ans.matrix[i][j]%=mod;
}
}
}
ans.x=x,ans.y=a.y;
return ans;
}
Matrix operator%(const int& a) const{
Matrix ans;
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
ans.matrix[i][j]=matrix[i][j]%a;
}
}
return *this;
}
Matrix operator^(const long long& a) const{
Matrix ans(1,x,y),power(*this);
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
if(i!=j) ans.matrix[i][j]=0;
}
}
long long tmp=a;
while(tmp){
if(tmp&1){
ans=ans*power;
ans=ans%mod;
}
power=power*power;
tmp>>=1;
power=power%mod;
}
return ans;
}
}m;
long long n,k,p;
int t;
const long long d[105][105]={\
{0,0,0},
{0,1,1},
{0,1,0}
};
Matrix c(1,2,1);
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main(){
Matrix m(d,2,2);
cin>>n>>p;
k=gcd(n,p);
if(k<=2) {
cout<<1<<endl;
return 0;
}
Matrix ans=c*(m^(k-1));
cout<<ans.matrix[1][1]<<endl;
return 0;
}
蒟蒻写博客不易,还请各位大佬点个赞~~
【Luogu】P1306 斐波那契公约数 题解的更多相关文章
- Luogu P1306 斐波那契公约数
这道题其实是真的数学巨佬才撸的出来的题目了 但如果只知道结论但是不知道推导过程的我感觉证明无望 首先这道题肯定不能直接搞,而且题目明确说明了一些方法的问题 所以就暗示我们直接上矩阵了啦 但是如果直接搞 ...
- 【luogu P1306 斐波那契公约数】 题解
题目链接:https://www.luogu.org/problemnew/show/P1306#sub gcd(f[m],f[n]) = f[gcd(m,n)] #include <iostr ...
- 洛谷 P1306 斐波那契公约数 题解
题面 结论:gcd(F[n],F[m])=F[gcd(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 F[n ...
- 洛谷 P1306 斐波那契公约数
洛谷 P1306 斐波那契公约数 题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? ...
- 洛谷- P1306 斐波那契公约数 - 矩阵快速幂 斐波那契性质
P1306 斐波那契公约数:https://www.luogu.org/problemnew/show/P1306 这道题目就是求第n项和第m项的斐波那契数字,然后让这两个数求GCD,输出答案的后8位 ...
- 洛谷 P1306 斐波那契公约数 解题报告
P1306 斐波那契公约数 题意:求\(Fibonacci\)数列第\(n\)项和第\(m\)项的最大公约数的最后8位. 数据范围:\(1<=n,m<=10^9\) 一些很有趣的性质 引理 ...
- 洛谷——P1306 斐波那契公约数
P1306 斐波那契公约数 题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? 输入输 ...
- P1306 斐波那契公约数
题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? 输入输出格式 输入格式: 两个正整 ...
- 【Luogu】P1306斐波那契公约数(递推)
题目链接 有个定理叫gcd(f(n),f(m))=f(gcd(n,m)) 所以递推就好了. #include<cstdio> #include<cstdlib> #includ ...
随机推荐
- osgEarth使用笔记1——显示一个数字地球
目录 1. 概述 2. 实现 2.1. 三维显示 2.2. 二维显示 1. 概述 osgEarth支持.earth格式的文件,里面保存了数字地球相关信息的配置XML,只需要读取这个配置文件,就可以直接 ...
- IdentityServer4系列 | 初识基础知识点
前言 我们现在日常生活中,会使用各式各样的应用程序,层出不穷,其中有基于网页浏览方式的应用,有基于手机端的App,甚至有基于流行的公众号和小程序等等,这些应用,我们不仅要实现各个应用的功能之外,还要考 ...
- 实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
一.实验目的 熟悉 Postman 的使用;熟悉如何使用 OpenDaylight 通过 Postman 下发流表. 二.实验任务 流表有软超时和硬超时的概念,分别对应流表中的 idle_timeou ...
- DMZ是什么
刚刚接触安全域,实在是佩服自己真的是菜,,,啥都不懂,看看过段时间能有多大进步吧... 概念 DMZ:它是一个缓冲区,一个隔离区.它是位于两台防火墙之间的区域,相对于INTER网来说安全级别高一些,但 ...
- Python自学02day——变量和简单的数据类型
1.变量是什么? 变量存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型, ...
- 2017年 实验三 C2C模拟实验
[实验目的] 掌握网上购物的基本流程和C2C平台的运营 [实验条件] ⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网. (3).奥派电子商务应用软件 [知识准备] 本实验需要的理论知识:C2C ...
- java基础小程序—万年历
package day02.xiangmu.wannianli; import java.util.Scanner; public class CalendarTest { public static ...
- 无法访问GitHub
我们开发者经常用的最大的同性交流平台--GitHub忽然访问不了了,很尴尬 可以打开控制台 ping一下 github.com 果不其然 不通 不过幸运的是里面有github的ip地址,好像是美国某个 ...
- composer 阿里云加速 转
阿里云 Composer 全量镜像 本镜像与 Packagist 官方实时同步,推荐使用最新的 Composer 版本. 最新版本: 1.10.8 下载地址: https://mirrors.aliy ...
- Postgres 10.11安装教程
Postgres搭建 考虑到Drone和Sonarqube等都需要借助Postgres存储,为了保证CI服务的高效的工作,将考虑独立其中依赖的数据库,避免在繁忙时占用过多资源从而影响整体CI的速度. ...