首页 > 其他 > 详细

[HDU] Fibonacci Check-up

时间:2017-12-09 17:31:41      阅读:259      评论:0      收藏:0      [点我收藏+]

这是链接

结论破题,浪费了我三张纸,结论居然只和斐波那契数列有关,有趣
推导过程太多不写了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

原文:http://www.cnblogs.com/notseefire/p/8012005.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!