2017第二次多校联合Funnyfunction

来源:互联网 发布:quickfix python 编辑:程序博客网 时间:2024/06/11 05:04

题目
题意:这个题意就不用说了吧
题解:矩阵快速幂
dalao博客

#include<bits/stdc++.h>using namespace std;#define ll long longconst ll mod=1e9+7;struct bbq{    ll a[2][2];};bbq mx(bbq a,bbq b){    bbq ans;    memset(ans.a,0,sizeof ans.a);    for(int i=0; i<2; i++)    {        for(int j=0; j<2; j++)        {            for(int k=0; k<2; k++)            {                ans.a[i][j]+=a.a[i][k]*b.a[k][j]%mod;                ans.a[i][j]%=mod;            }        }    }    return ans;}bbq qmod(bbq a,ll n){    bbq ans;    memset(ans.a,0,sizeof ans.a);    ans.a[0][0]=ans.a[1][1]=1;    while(n)    {        if(n%2==1)ans=mx(ans,a);        a=mx(a,a);        n/=2;    }    return ans;}int main(){    bbq a,b1,b0,ans;    int t,ca=1;    scanf("%d",&t);    memset(a.a,0,sizeof a.a);    memset(b0.a,0,sizeof b0.a);    memset(b1.a,0,sizeof b1.a);    a.a[0][0]=0;    a.a[0][1]=2;    a.a[1][0]=a.a[1][1]=1;    b0.a[0][0]=b0.a[1][1]=1;    b0.a[1][0]=b0.a[0][1]=0;    b1.a[0][0]=-1;    b1.a[0][1]=2;    b1.a[1][0]=1;    b1.a[1][1]=0;    while(t--)    {        memset(ans.a,0,sizeof ans.a);        ll n,m;        scanf("%lld %lld",&n,&m);        ans=qmod(a,n);        if(n%2==0)        {            for(int i=0; i<2; i++)            {                for(int j=0; j<2; j++)                    ans.a[i][j]-=b0.a[i][j];            }        }        else {            for(int i=0; i<2; i++)            {                for(int j=0; j<2; j++)                    ans.a[i][j]-=b1.a[i][j];            }        }        ans=qmod(ans,m-1);        printf("%lld\n",(ans.a[0][0]+ans.a[1][0])%mod);    }}
原创粉丝点击