传统弱校HFUT的蒟蒻,真相只有一个

HDU 2855 斐波那契+矩阵快速幂

http://acm.hdu.edu.cn/showproblem.php?pid=2855

化简这个公式,多写出几组就会发现规律

d[n]=F[2*n]

后面的任务就是矩阵快速幂拍一个斐波那契模板出来了

这里用的是2维 vector

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
typedef vector<int>vec;
typedef vector<vec>mat;
typedef long long ll;
typedef unsigned int uint;
int M;
mat mul(mat &a,mat &b)
{
    mat c(a.size(),vec(b[0].size()));
    for(uint i=0;i<a.size();i++)
    {
        for(uint k=0;k<b.size();k++)
        {
            for(uint j=0;j<b[0].size();j++)
            {
                c[i][j]=(c[i][j]+a[i][k]*b[k][j])%M;
            }
        }
    }
    return c;
}

mat pow(mat a,ll n)
{
    mat b(a.size(),vec(a.size()));
    for(uint i=0;i<a.size();i++)
    {
        b[i][i]=1;
    }
    while(n>0)
    {
        if(n&1) b=mul(b,a);
        a=mul(a,a);
        n>>=1;
    }
    return b;
}
ll n;
int main()
{
    int T,n,i;
    scanf("%d",&T);
    for(i=1;i<=T;i++)
    {
        scanf("%d%d",&n,&M);
        mat a(2,vec(2));
        a[0][0]=a[0][1]=a[1][0]=1;
        a[1][1]=0;
        a=pow(a,2*n);
        printf("%d\n",a[1][0]);
    }
    return 0;
}

 

posted @ 2016-02-26 10:35  未名亚柳  阅读(154)  评论(0编辑  收藏  举报