• 烦神的斐波那契&&洛谷-1306-斐波那契公约数


    传送门

    洛谷1306传送门

    -----------------------------------------------------------------------------------------------------------------------------------------------------

    内网题题面

    题目描述

        烦神看上了一个妹子,烦神想找她约会,可是妹子出了一道数学题来考验烦神,烦神只有做对了,妹子才会跟他去约会,题目是这样的:

        给出两个正整数A和B,要求求出斐波那契数列的第A项和第B项的最大公约数,结果对19990208取模(烦神约的妹子的生日)。

        烦神当然可以秒杀啦,但是他没有时间做,于是他把这个问题留给了你们,他还要节省下时间去约下一个妹子,你能帮帮他吗?

     

    输入

    第一行一个正整数T,表示有T组数据,

    接下来T行,每行两个正整数A和B。

    输出

    输出有T行,第 i 行对应第 i 组数据的答案.

    样例输入

    2
    1 1
    36 48

    样例输出

    1
    144

    提示

    0 < A, B <= 10^9.

    1 <= T <= 100000.

    -----------------------------------------------------------------------------------------------------------------------------------------------------

    有一个很有意思的点

        gcd(F[n],F[m])=F[gcd(n,m)]

    于是再+矩阵快速幂就好了

    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define mem(p) memset(&p,0,sizeof(p))
    using namespace std;
    const ll mod=1e8;
    ll n,m;
    struct mat{ll a[3][3],r,c;};
    il mat mul(mat x,mat y)
    {
        mat p;
        mem(p);
        for(int i=0;i<x.r;i++)
            for(int j=0;j<y.c;j++)
                for(int k=0;k<x.c;k++)
        p.a[i][j]=(p.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
        p.r=x.r,p.c=y.c;
        return p;
    }
    il void fast(ll k)
    {
        mat p,ans;
        mem(p),mem(ans);
        p.r=p.c=2;
        p.a[0][0]=p.a[0][1]=p.a[1][0]=1;
        ans.r=1,ans.c=2;
        ans.a[0][0]=ans.a[0][1]=1;
        while(k)
        {
            if(k&1)ans=mul(ans,p);
            p=mul(p,p);
            k>>=1;
        }
        cout<<ans.a[0][0];
    }
    il ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    int main()
    {
        ios::sync_with_stdio(0);
        cin>>n>>m;
        n=gcd(n,m);
        if(n<=2)cout<<1;
        else fast(n-2);
        return 0;
    }
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define ll long long
    using namespace std;
    const ll mod = 19990208;
    ll u,f[100005];
    struct mat
    {
        ll m[4][4],l,r;
    };
    inline mat mul(mat x,mat y)
    {
        mat p;
        memset(&p,0,sizeof(p));
        for(int i = 1;i <= x.l;i++)
            for(int j = 1;j <= y.r;j++)
                for(int k = 1;k <= x.r;k++)
                    p.m[i][j] = (p.m[i][j] + x.m[i][k] *y.m[k][j]%mod)% mod;
        p.l = x.l,p.r = y.r;
        return p;
    }
    void fast(ll k)
    {
        mat p,ans;
        memset(&p,0,sizeof(p));
        memset(&ans,0,sizeof(ans));
        p.m[1][1] = p.m[1][2] = p.m[2][1] = 1;
        p.l = 2;p.r = 2;
        ans.m[1][1] = ans.m[1][2] = 1;
        ans.l = 1,ans.r = 2;
        while(k)
        {
            if(k & 1)
                ans = mul(ans,p);
            p = mul(p,p);
            k >>= 1;
        }
        printf("%lld
    ",ans.m[1][1]);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        ll a,b,maxn = -10;
        f[1] = f[2] = 1;
        for(int i = 1;i <= t;i++)
        {
            scanf("%lld%lld",&a,&b);
            u = __gcd(a,b);
            if(u <= 2)
                printf("1
    ");
            else
                fast(u - 2);
        }
        return 0;
    }

    emm...

    两次都因为struct结构体后面忘加“;”而gg

    好在

    还是一次a了

  • 相关阅读:
    Makefile与shell脚本区别
    Linux fdisk命令参数及用法详解---Linux磁盘分区管理命令fdisk
    李洪强iOS开发之XMPP
    李洪强iOS开发之宏定义方法来初始化一个单例对象
    李洪强iOS开发之拓展篇—UIDynamic(简单介绍)
    李洪强iOS开发之【零基础学习iOS开发】【02-C语言】07-基本数据类型
    李洪强iOS开发之OC[018]对象和方法之间的关系
    李洪强漫谈iOS开发[C语言-011]
    李洪强iOS开发之静态库
    李洪强iOS开发之【零基础学习iOS开发】【02-C语言】06-变量与内存
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10650094.html
Copyright © 2020-2023  润新知