[HDU] Fibonacci Check-up

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[HDU] Fibonacci Check-up相关的知识,希望对你有一定的参考价值。

这是链接

结论破题,浪费了我三张纸,结论居然只和斐波那契数列有关,有趣
推导过程太多不写了qwq,虽然推导很简单,但是有个坑点,很难想到将 $ S_i $ 最终化为 $ F_i $ 表示。
结论是 \[ S_i = F_{n*2} \]
所以这道题我们只需要求斐波那契数就行了,是不是很简单啊qwq。


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;
typedef long long ll;
const int N = 5;

ll Mod;

struct matrix{
    ll M[N][N];
    int l,r;
    
    void operator * (matrix x){
        int i,j,k; matrix t;
        for(i=1;i<=l;i++)
            for(j=1;j<=r;j++)
                t.M[i][j]=0;
        for(i=1;i<=r;i++)
            for(j=1;j<=x.l;j++)
                for(k=1;k<=l;k++)
                    t.M[j][i] = (t.M[j][i] + M[k][i] * x.M[j][k]) %  Mod;
        for(i=1;i<=l;i++)
            for(j=1;j<=r;j++)
                M[i][j]=t.M[i][j];
    }
}res,a,c,ans;

int main(){
    int i,j,T,cnt;ll n;
    res.l=2; res.r=1;
    a.l=a.r=2;
    a.M[1][1]=a.M[1][2]=a.M[2][1]=1; a.M[2][2]=0;
    res.M[1][1]=1; res.M[1][2]=0;
    scanf("%d",&T);
    while(T--){
        scanf("%lld%lld",&n,&Mod);
        if(n==0){
            printf("0\n");
            continue;
        }
        ans=res;
        c=a; 
        n*=2; n-=1;
        for(; n ; n >>= 1){
            if(n & 1) ans * c;
            c * c;
        }
        printf("%lld\n",ans.M[1][1]);
    }
    return 0;
}

以上是关于[HDU] Fibonacci Check-up的主要内容,如果未能解决你的问题,请参考以下文章

HDU2855—Fibonacci Check-up

hdu 1568 Fibonacci

Fibonacci String(hdu 1708)

HDU 1021 Fibonacci Again 数学题

HDU 1021 Fibonacci Again

hdu1568 Fibonacci---前4位