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 long ll;
int T, N, g;
ll n, m, aa, cc, x0, mod;
struct Matrix
{
    ll a[4][4];
    Matrix& operator =(const Matrix& x)
    {
        for (register int i = 1; i <= N; ++i)
            for (register int j = 1; j <= N; ++j)
                a[i][j] = x.a[i][j];
        return *this;
    }
};
Matrix a, b, c;
ll _mul(ll x, ll y, ll s = 0)
{
    for (; y; y >>= 1, x = (x + x) % mod)
        if (y & 1)
            s = (s + x) % mod;
    return s;
}
Matrix Mul(const Matrix& x, const Matrix& y)
{
    Matrix s;
    for (register int i = 1; i <= N; ++i)
        for (register int j = 1; j <= N; ++j)
            s.a[i][j] = 0;
    for (register int i = 1; i <= N; ++i)
        for (register int j = 1; j <= N; ++j)
            for (register int k = 1; k <= N; ++k)
                s.a[i][j] = (s.a[i][j] + _mul(x.a[i][k], y.a[k][j])) % mod;
    return s;
}
Matrix _pow(Matrix x, ll y)
{
    Matrix s;
    for (register int i = 1; i <= N; ++i)
        for (register int j = 1; j <= N; ++j)
            s.a[i][j] = (i == j);
    for (; y; y >>= 1, x = Mul(x, x)) if (y & 1) s = Mul(s, x);
    return s;
}
int main()
{
    N = 2;
    scanf("%lld%lld%lld%lld%lld%d", &m, &aa, &cc, &x0, &n, &g);
    mod = m;
    c.a[1][1] = x0; c.a[1][2] = cc;
    a.a[1][1] = aa; a.a[2][1] = a.a[2][2] = 1;
    if (n <= 0) {printf("%lld\n", x0); return 0; }
    b = Mul(c, _pow(a, n));
    printf("%lld\n", (b.a[1][1] + mod) % mod % g);
}

原文地址:https://www.cnblogs.com/xuyixuan/p/9806758.html

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

P1306 斐波那契公约数的相关文章

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

Luogu P1306 斐波那契公约数

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

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

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

\(\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

9.求斐波那契Fibonacci数列通项

(1)递归实现: #include<iostream>using namespace std;int Fibonacci(int); int main(){    int n;    cout<<"please input an number n: "<<endl;    cin>>n; for(int i=1;i<=n;i++)    {        cout<<Fibonacci(i)<<endl; 

HDU 4549 M斐波那契数列(矩阵快速幂 费马小定理)

M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行. Samp

斐波那契数列小结

关于斐波那契数列,相信大家对它并不陌生,关于其的题目也不在少数. 我现在总结一下有关它的一些有趣的性质. 基础问题 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}