2 2 3
3 4
題意:一個項鍊有n個珠子,這個項鍊是個鏈,不是一個環,項鍊上連續素數個珠子中紅色珠子個數要大於等於藍色珠子php
解題思路:找出前面幾個,發現存在遞推關係f[i]=f[i-1]+f[i-3],而後構造矩陣,矩陣快速冪ios
{1 1 0}app
矩陣構造: {a[i],a[i-1],a[i-2]}={a[i-1],a[i-2],a[i-3]}*{0 0 1}less
{1 0 0}atom
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <map> #include <cmath> #include <set> #include <stack> #include <queue> #include <vector> #include <bitset> #include <functional> using namespace std; #define LL long long const int INF=0x3f3f3f3f; #define mod 1000000007 LL n; struct Matrix { LL v[5][5]; Matrix() { memset(v,0,sizeof v); } }dan; Matrix mul(Matrix a,Matrix b,int d) { Matrix ans; for(int i=1; i<=d; i++) { for(int j=1; j<=d; j++) { for(int k=1; k<=d; k++) { ans.v[i][j]+=a.v[i][k]*b.v[k][j]; ans.v[i][j]%=mod; } } } return ans; } Matrix pow(Matrix a,LL k,int d) { Matrix ans=dan; while(k) { if(k&1) ans=mul(ans,a,d); k>>=1; a=mul(a,a,d); } return ans; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%lld",&n); if(n==2) {printf("3\n");continue;} if(n==3) {printf("4\n");continue;} if(n==4) {printf("6\n");continue;} Matrix ans,a; a.v[1][1]=a.v[3][1]=a.v[1][2]=a.v[2][3]=1; dan.v[1][1]=6,dan.v[1][2]=4,dan.v[1][3]=3; ans=pow(a,n-4,3); printf("%lld\n",ans.v[1][1]); } return 0; }