您的位置:首页 > 其它

P1939 【模板】矩阵加速(数列)

2017-08-16 20:53 225 查看
传送门

根据题目的意思,还有瞎jb凑,凑出来这个矩阵

|f
,f[n-1],f[n-2]|=|f[n-1],f[n-2],f[n-3]|*|1,0,1,|

                  |1,0,0|

                  |0,1,0|

还是老套路矩阵快速幂就可以AC辣

#include <cstdio>
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
const int p=1e9+7;
ll ans[2][4];
ll x[4][4];
ll dx[4][4];
void init()
{
memset(ans,0,sizeof(ans));
memset(x,0,sizeof(x));
ans[1][1]=1,ans[1][2]=1,ans[1][3]=1;
x[1][1]=1,x[1][3]=1,x[2][1]=1,x[3][2]=1;
}
void ans_cf()
{
for(int i=1;i<=3;i++)
dx[1][i]=ans[1][i],ans[1][i]=0;
for(int i=1;i<=1;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
ans[i][j]=(ans[i][j]+(dx[i][k]*x[k][j])%p)%p;
}
void x_cf()
{
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
dx[i][j]=x[i][j],x[i][j]=0;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
x[i][j]=(x[i][j]+(dx[i][k]*dx[k][j])%p)%p;
}
void fast_pow(int k)
{
while(k)
{
if(k%2) ans_cf();
k/=2;
x_cf();
}
}
int main()
{
ll n;
scanf("%lld",&n);
while(n--)
{
init();
ll w;
scanf("%lld",&w);
if(w<=3)
{
printf("1\n");
continue;
}
fast_pow(w-3);
printf("%lld\n",ans[1][1]%p);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: