array challenge

题目链接

思路

队友连答案的规律都能直接找出来,我只能提供一个矩阵。然后就过了。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

using namespace std;
const int maxn=14;
typedef long long ll;
const int N=10;
const ll mo=1000000007;
ll tmp[N][N];
ll c[N][N],d[N][N];
ll ans[5]={0,0,31,197,1255};
void (ll a[][N],ll b[][N],int n){

memset(tmp,0,sizeof (tmp));

for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++){
tmp[i][j]+=a[i][k]*b[k][j];
tmp[i][j]%=mo;
}

for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=tmp[i][j];
}

ll res[N][N];
void Pow(ll a[][N],ll n,int cnt){
memset(res,0,sizeof (res));
for(int i=0;i<cnt;i++) res[i][i]=1;
while(n)
{
if(n&1)
multi(res,a,cnt);
multi(a,a,cnt);
n>>=1;
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
ll n;
scanf("%lld",&n);
if(n<=4) {printf("%lldn",ans[n]); continue;}
c[0][0]=4; c[0][1]=17; c[0][2]=-12;
c[1][0]=1; c[1][1]=c[1][2]=c[2][0]=c[2][2]=0;
c[2][1]=1;
Pow(c,n-4,3);
d[0][0]=ans[4]; d[1][0]=ans[3]; d[2][0]=ans[2];
multi(res,d,3);
printf("%lldn",(mo+res[0][0])%mo);
}
}