题意:
请你构造长度为 N 的 01 串,使得串中所有素数长度的子串中 0 的数量不少于 1 的数量,问这样的串有多少个。
思路:
看到数据量就明白了这一类题的做法
1.打表
2.根据打表结果,写出递推方程。
3.将递推方程构造为矩阵。
4.快速幂求解。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int MAX=3;
const ll mod=1e9+7;
typedef struct
{
ll m[MAX][MAX];
}Matrix;
Matrix P={1,1,0,0,0,1,1,0,0};
Matrix I={13,9,6,0,0,0,0,0,0};
Matrix matrixmul(Matrix a,Matrix b)
{
Matrix c;
for(int i=0;i<MAX;i++)
for(int j=0;j<MAX;j++)
{
c.m[i][j]=0;
for(int k=0;k<MAX;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]+mod)%mod;
}
return c;
}
ll quickpow(ll n)
{
Matrix m=P,b=I;
while(n)
{
if(n&1)
b=matrixmul(b,m);
n=n>>1;
m=matrixmul(m,m);
}
return b.m[0][0];
}
int main()
{
ll n;
int T;
scanf("%d",&T);
int a[10];
a[2]=3,a[3]=4,a[4]=6,a[5]=9,a[6]=13;
while(T--)
{
scanf("%lld",&n);
if(n<=6)
printf("%d\n",a[n]);
else
printf("%lld\n",quickpow(n-6));
}
return 0;
}