洛谷 P1306 斐波那契公约数 题解

洛谷 P1306 斐波那契公约数 题解

洛谷 P1306 斐波那契公约数

题意

f 为斐波那契数列,求出 gcd(fn,fm)mod108

1n,m109

思路

定理 gcd(fn,fm)=fgcd(n,m)n,m>0)。

引理 1 fn=fmfnm+1+fm1fnm

证明 根据斐波那契数列的递推式,有

(1)fmfnm+1+fm1fnm=fm1(fnm+fnm+1)+fm2fnm+1(2)=fm1fnm+2+fm2fnm+1.

观察到 (2)(1) 结构相同,于是可以递推下去,直到 (1)m=2,于是 (1) 等于

f2fn1+f1fn2=fn1+fn2=fn.

引理 2(更相减损术) 设 a>b>0,则 gcd(a,b)=gcd(a,ab)

证明 见 3.2 L5-NOIP训练29 测试题解 - f2021ljh

由引理 2 也可以得到推论 gcd(a,b)=gcd(a,akb),其中 kZ

引理 3 gcd(fm,fm1)=1

证明 由递推式和引理 2 得

gcd(fm,fm1)=gcd(fm1+fm2,fm1)=gcd(fm1,fm2).

于是一直递推下去可以得到

gcd(fm,fm1)=gcd(f2,f1)=1.

下面证明整个定理。

证明 n=m 时显然成立。不妨设 n>m。由引理 1 和引理 2 的推论得

gcd(fn,fm)=gcd(fmfnm+1+fm1fnm,fm)=gcd(fm1fnm,fm).

由引理 3 和 gcd 的性质得

gcd(fn,fm)=gcd(fnm,fm).

继续递归下去,则有 gcd(fnm,fm)=fgcd(nm,m)(与更相减损术的递归方式相同)。于是原命题得证。

代码

/*
https://www.luogu.com.cn/problem/P1306
P1306 斐波那契公约数
*/

#include <cassert>
#include <iostream>
#include <algorithm>
#define f(x, y, z) for (int x = (y); x <= (z); ++x)
using namespace std;
typedef long long ll;
int constexpr MOD = 1e8;
int n, m;

inline int &AddEq(int &a, int const &b) { return (a += b) >= MOD ? (a -= MOD) : a; }
inline int Mul(int const &a, int const &b) { ll r = 1ll * a * b; return r >= MOD ? r % MOD : r; }

struct Matrix {
    int a[3][3], r, c;
} A, B, I, E;

Matrix operator*(Matrix const &a, Matrix const &b) {
    assert(a.c == b.r);
    Matrix c = E;
    c.r = a.r, c.c = b.c;
    f(i, 1, c.r) f(j, 1, c.c) f(k, 1, a.c)
        AddEq(c.a[i][j], Mul(a.a[i][k], b.a[k][j]));
    return c;
}

Matrix ksm(Matrix a, int x) {
    Matrix res = I;
    while (x) {
        if (x & 1) res = res * a;
        a = a * a;
        x >>= 1;
    }
    return res;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    
    cin >> n >> m;
    n = __gcd(n, m);
    if (n == 1 || n == 2) return cout << 1 << '\n', 0;
    I.r = I.c = 2, I.a[1][1] = I.a[2][2] = 1;
    A.r = 2, A.c = 1, A.a[1][1] = A.a[2][1] = 1;
    B.r = B.c = 2, B.a[1][1] = B.a[1][2] = B.a[2][1] = 1;
    A = ksm(B, n - 2) * A;
    cout << A.a[1][1] << '\n';
    
    return 0;
}
posted @   f2021ljh  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示