题意:一个项链是由红蓝两个珠子构成,项链不是环,是一条线,要求每一个素数长度红色珠子的个数大于等于蓝色珠子的个数,给你n个珠子问符合条件的项链的个数。
思路:一看取模就知道数很大,推规律,写出递推式。
1表示红色0表示蓝色
2
10 01 11 3
3
101 111 110 011 4
4
1011 1101 1110 0111 1111 0110 6
5
11111 11110 11101 11011 10111 01111 10110 01110 01101 9
6
111111 111110 111101 111011 110111 101111 011111 110110 101110 011110 101101 011101 011011 13
fi=fi-1+fi-3
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
struct matrix
{
ll m[5][5];
};
matrix mutil(matrix a,matrix b)
{
matrix c;
memset(c.m,0,sizeof(c.m));
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
for(int k=1;k<=3;k++)
{
c.m[i][j]=(c.m[i][j]+a.m[i] [k]*b.m[k][j])%mod;
}
c.m[i][j]%=mod;
}
}
return c;
}
matrix powmod(matrix a,ll k)
{
matrix ans;
memset(ans.m,0,sizeof(ans.m)); for(int i=1;i<=3;i++)
ans.m[i][i]=1;
while(k)
{
if(k&1)
{
ans=mutil(ans,a);
k--;
}
k>>=1;
a=mutil(a,a);
}
return ans;
}
int main()
{
int t;
ll n,res;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
if(n==2)
printf("3\n");
else if(n==3)
printf("4\n");
else if(n==4)
printf("6\n");
else
{
matrix a,b,c,d;
a.m[1][1]=1;
a.m[1][2]=0;
a.m[1][3]=1;
a.m[2][1]=1;
a.m[2][2]=0;
a.m[2][3]=0;
a.m[3][1]=0;
a.m[3][2]=1;
a.m[3][3]=0;
memset(c.m,0,sizeof(c.m));
c.m[1][1]=6;
c.m[2][1]=4;
c.m[3][1]=3;
b=powmod(a,n-4);
d=mutil(b,c);
printf("%lld\n",d.m[1][1]);
}
}
}