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

题目描述

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

Update:加入了一组数据。

输入输出格式

输入格式:

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

注意:数据很大

输出格式:

Fn和Fm的最大公约数。

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

输入输出样例

输入样例#1: 复制

4 7

输出样例#1: 复制

1

结论:gcd(F[n],F[m])=F[gcd(n,m)]就是一个ksm了代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<cmath>
#include<map>
#define mod 100000000
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
struct mat
{
    ll a[5][5];
};
mat mul(mat x,mat y)
{
    mat ans;
    memset(ans.a,0,sizeof(ans.a));
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            for(int k=0;k<2;k++)
            {
                ans.a[i][j]=(ans.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
            }
        }
    }
    return ans;
}
mat ans;
ll ksm(int x)
{
    mat res;
    res.a[0][0]=1;
    res.a[0][1]=1;
    res.a[1][0]=1;
    res.a[1][1]=0;
    while(x)
    {
        if(x&1)
        {
            ans=mul(ans,res);

        }
        x>>=1;
        res=mul(res,res);
    }
    return ans.a[0][0]%mod;
}
int main()
{
    int n,m;
    cin>>n>>m;
    int x=__gcd(n,m);
    memset(ans.a,0,sizeof(ans.a));
    ans.a[0][0]=1;
    ans.a[1][0]=1;
    ll answer=ksm(x-1);
    printf("%lld\n",answer);
    return 0;
} 

原文地址:https://www.cnblogs.com/Staceyacm/p/11219583.html

时间: 2024-11-12 14:16:57

P1306 斐波那契公约数(ksm+结论)的相关文章

洛谷P1306 斐波那契公约数

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 说明 用递归&递推会超时 用通项公式也会超时 /* 首先,斐波

P1306 斐波那契公约数

题意 求斐波那契数列第n项和第m项的最大公约数 题解 设斐波那契数列第x项为F[x] 则有结论\(Gcd(F[n], F[m]) = F[Gcd(n, m)]\) 证明: 不妨设n < m 则\(F[m] = F[m-1] +F[m-2]\) \(= 2*F[m-2] + F[m-3]\) \(= 3*F[m-3] + 2*F[m-4]\) \(=...\) \(= F[x+1]*F[m-x] + F[x] * F[\) 代码 #include <cstdio> typedef long

Luogu P1306 斐波那契公约数

这道题其实是真的数学巨佬才撸的出来的题目了 但如果只知道结论但是不知道推导过程的我感觉证明无望 首先这道题肯定不能直接搞,而且题目明确说明了一些方法的问题 所以就暗示我们直接上矩阵了啦 但是如果直接搞还要高精度,不仅很烦而且绝壁TLE 所以我们引出性质,其中f[x]表示斐波那契数列的第x项: gcd(f[n],f[m])=f[gcd(n,m)] 具体的超详细的证明戳这里 然后题意相当于对f[gcd(n,m)]取膜1e9,就是最基本的矩阵优化了 关于矩阵优化斐波那契的板子题看这里 关于这题的COD

斐波那契公约数的相关证明

\(\text{来一波斐波那契公约数的证明}QwQ\) \(\text{已知} \{F_n\} \text{为斐波那契数列,求证:}\) \[\forall\ n,m\in\text{Z}^{+},(F_n,F_m)=F_{(n,m)}\] \(\text{证明:}\) \(\text{令}\) \(n<m\) \(\text{用 }F_n\text{ 和 }F_{n+1}\text{ 表示 } F_{n+2},F_{n+3},F_{n+4},\cdots\) \[F_{n+2}=F_n+F_{

【斐波那契】【矩阵快速幂模板】斐波那契公约数

这道题求第n项和第m项斐波那契的公约数这里有一个定理(n,m都是1e9) gcd(f[m],f[n])=f[gcd(n,m)] 斐波那契使用矩阵快速幂求 #include <bits/stdc++.h> #define ll long long #define ull unsigned long long #define ld long double using namespace std; const int maxn=20010; const int NIL=0; const int mo

斐波那契公约数(luogu 1306)

题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很"简单"问题:第n项和第m项的最大公约数是多少? Update:加入了一组数据. 输入输出格式 输入格式: 两个正整数n和m.(n,m<=10^9) 注意:数据很大 输出格式: Fn和Fm的最大公约数. 由于看了大数字就头晕,所以只要输出最后的8位数字就可以了. 输入输出样例 输入样例 4 7 输出样例 1 说明 用递归&递推会超时 用通项公式也会超时 co

斐波那契数列小结

关于斐波那契数列,相信大家对它并不陌生,关于其的题目也不在少数. 我现在总结一下有关它的一些有趣的性质. 基础问题 1.求斐波那契数列的第k项 常规方法是利用f[i]=f[i-1]+f[i-2],时间复杂度为O(n) 显然最多处理到1e7 假如n到1e18怎么办,O(n)显然就T飞了. 我们考虑利用什么方法来加速 斐波那契数列数列是其次线性递推式 所以是可以利用矩阵乘法进行求解的 $$ \left [ \begin{matrix} 1 & 1 \\ 1 & 0  \end{matrix}

51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

Bash游戏V1 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得比赛. 例如N = 3,K = 2.无论A如何拿,B都可以拿到最后1颗石子. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行2个数N,K.中间用空格分隔.(1 <= N,K <= 10^9) Output 共T

UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵快速幂,输出等了几秒钟才输出完,肯定会超时.因为所有计算都是要取模的,设F[i]=f[i] mod n.F[0]=F[1]=1.只要出现F[i]=F[i+1]=1,那么整个序列就会重复.例如n=3,则序列为1,1,2,0,2,2,1,0,1,1……第九项和第十项都等于1,所以之后的序列都会重复. 至