hdu 3658 How many words

时间:2022-03-04 10:53:38

思路:

构造矩阵,矩阵快速幂!!!

代码如下:

 #include<cstdio>
#include<vector>
#include<cmath>
#include<iostream>
#include<cstring>
#define ll __int64
#define mod 1000000007
using namespace std;
int let[];
struct ma
{
ll a[][];
}A,B;
ll sum(ma a)
{
ll ans=;
for(int i=;i<;i++)
for(int j=;j<;j++)
ans=(ans+a.a[i][j])%mod;
return ans;
}
void init()
{
int i,j;
for(i='a';i<='z';i++){
let[i-'a']=i;
let[i-'a'+]=i-'a'+'A';
}
for(i=;i<;i++)
for(j=;j<;j++){
if(abs(let[i]-let[j])<=) A.a[i][j]=;
if(abs(let[i]-let[j])<) B.a[i][j]=;
}
}
ma mul(ma a,ma b)
{
ma ans;
for(int i=;i<;i++)
for(int j=;j<;j++){
ans.a[i][j]=;
for(int k=;k<;k++)
ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
}
return ans;
}
ma pows(ma a,int b)
{
ma ans;
for(int i=;i<;i++)
for(int j=;j<;j++)
ans.a[i][j]=(i==j);
while(b){
if(b&) ans=mul(ans,a);
b>>=;
a=mul(a,a);
}
return ans;
}
int main()
{
init();
int m,t;
scanf("%d",&t);
while(t--){
scanf("%d",&m);
ll res=sum(pows(A,m-))-sum(pows(B,m-));
if(res<) res=(res%mod+mod)%mod;
printf("%I64d\n",res);
}
return ;
}