码迷,mamicode.com
首页 > 其他好文 > 详细

[HDU] Fibonacci Check-up

时间:2017-12-09 18:07:39      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:res   mat   ios   include   lld   oid   markdown   type   def   

这是链接

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

标签:res   mat   ios   include   lld   oid   markdown   type   def   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!