题解:P11410 闪耀之塔
这题首先考虑使
其次考虑让
代码
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
long long n,q,k;
string w;
struct node{
long long a[5][5];
}a,d;
long long ksm(long long i,long long j)
{
long long ans=1;
while(j)
{
if(j%2==1) ans=(ans*i)%mod;
i=(i*i)%mod;
j/=2;
}
return ans;
}
node cf(node i,node j)
{
node z;
for(int ii=1;ii<=3;++ii)
for(int jj=1;jj<=3;++jj)
z.a[ii][jj]=0;
for(int ii=1;ii<=3;++ii)
for(int jj=1;jj<=3;++jj)
for(int zz=1;zz<=3;++zz)
z.a[ii][jj]=(z.a[ii][jj]+i.a[ii][zz]*j.a[zz][jj])%mod;
return z;
}
long long ksm1(long long j)
{
while(j)
{
if(j%2==1) a=cf(a,d);
j/=2;
d=cf(d,d);
}
return a.a[1][1];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=1;i<=q;++i)
{
cin>>k>>w;
d.a[1][1]=1;
d.a[1][2]=0;
d.a[1][3]=0;
d.a[2][1]=4;
d.a[2][2]=4;
d.a[2][3]=0;
d.a[3][1]=1;
d.a[3][2]=1;
d.a[3][3]=2;
a.a[1][1]=a.a[1][2]=(ksm(2,k)-1+mod)%mod;
a.a[1][3]=1;
for(int j=1;j<=3;++j)
a.a[2][j]=a.a[3][j]=0;
cout<<ksm1(n-k)<<'\n';
}
return 0;
}