zoukankan      html  css  js  c++  java
  • 洛谷 1306斐波那契公约数

    题目描述

    还是看了题解

    结论:gcd(f[n],f[m])=f[gcd(n,m)]

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

      证明:利用辗转相减法:gcd(f[n],f[n+1])=gcd(f[n],f[n+1]-f[n])=gcd(f[n],f[n-1]),一直相减,最后得到gcd(f[n],f[n+1])=gcd(f[1],f[0])=1。

    证明:

      设f[n]=a,f[n+1]=b,

      则f[n+2]=a+b,f[n+3]=a+2b,f[n+4]=2a+3b,f[n+5]=3a+5b,f[n+6]=5a+8b,发现往后每一项a和b前的系数都为斐波那契数,

      所以f[m]=f[m-n-1]*a+f[m-n]*b。

      再看求解gcd的过程:

        gcd(f[n],f[m])=gcd(f[n],f[m]%f[n])

              =gcd(f[n],(f[m-n-1]*a+f[m-n]*b)%f[n])

              =gcd(f[n],f[m-n]*b)=gcd(f[n],f[m-n]*f[n+1]);

        因为gcd(f[n],f[n+1])=1,

        所以gcd(f[n],f[m])=gcd(f[n],f[m-n]),

        即gcd(f[n],f[m])=gcd(f[n],f[m%n]);

        继续向下递归求解,发现这个过程也就是求gcd(n,m)的过程

        所以gcd(f[n],f[m])=f[gcd(n,m)]

    //Gcd(f[a],f[b])=f[Gcd(a,b)]
    #include<complex>
    #include<cstdio>
    using namespace std;
    const int mod=1e8;
    struct Matrix{
        long long sz[2][2];
        inline Matrix operator *(const Matrix &a)const
        {
            Matrix res;
            for(int i=0;i<2;i++)
                for(int j=0;j<2;j++)
                {
                    res.sz[i][j]=0;
                    for(int k=0;k<2;k++)
                        res.sz[i][j]=(res.sz[i][j]+sz[i][k]*a.sz[k][j])%mod;
                }
            return res;
        }
    }a;
    int n,m;
    int Gcd(int a,int b)
    {
        if(!b)return a;
        return Gcd(b,a%b);
    }
    int Fpow(Matrix b,int p)
    {
        Matrix k=b;
        for(;p;p>>=1,k=k*k)
            if(p&1)b=b*k;
        return b.sz[0][0];
    }
    int main()
    {
        a.sz[0][0]=a.sz[0][1]=a.sz[1][0]=1;
        scanf("%d%d",&n,&m);
        n=Gcd(n,m);
        if(n<=2)puts("1");
        else printf("%d
    ",Fpow(a,n-2));
        return 0;
    }
  • 相关阅读:
    Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数
    SIM800C Couldn't pair with xxx because of an incorrect PIN or passkey
    SIM800C 使用基站定位
    SIM800C 透传模式
    paho.mqtt.embedded-c MQTTPacket transport.c hacking
    paho.mqtt.embedded-c MQTTPacket pub0sub1.c hacking
    RESTful API 学习
    MQTT连接服务器返回2
    Qemu编译qemu-system-arm
    adb安装启动Touch校正软件
  • 原文地址:https://www.cnblogs.com/LeTri/p/8780020.html
Copyright © 2011-2022 走看看