烦神的斐波那契&&洛谷-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了

原文地址:https://www.cnblogs.com/darlingroot/p/10650094.html