HDU 6030 Happy Necklace
阿新 • • 發佈:2019-01-29
題意:
請你構造長度為 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; }