cout 和 printf 在 C++ 中的實現:四捨六入五隨緣。好比 printf("%.0lf\n", x=1.5)
=> 1。spa
標準作法:printf("%d\n", (int)(x+0.5))
。code
由 \(a_n=2a_{n-3}+a_{n-1}\) 得矩陣轉移方程:it
\[ \begin{bmatrix} a_n & a_{n-1} & a_{n-2} \end{bmatrix} = \begin{pmatrix} 1 & 1 & 0 \\ 0 & 0 & 1 \\ 2 & 0 & 0 \end{pmatrix} \times \begin{bmatrix} a_{n-1} & a_{n-2} & a_{n-3} \end{bmatrix} \]io
這裏採用 []
表示 \(1\times 3\) 矩陣,()
表示 \(3\times 3\) 矩陣。class
ll p[5][5], b[5][5], d[5][5], t[5][5]; memset(p, 0, sizeof p), memset(b, 0, sizeof b), memset(d, 0, sizeof d); for (int i=1; i<=3; i++) b[i][i]=1ll; // unit matrix p[1][1]=1ll, p[1][2]=1ll, p[1][3]=0ll; p[2][1]=0ll, p[2][2]=0ll, p[2][3]=1ll; p[3][1]=2ll, p[3][2]=0ll, p[3][3]=0ll; // transition matrix d[1][1]=6ll, d[1][2]=1ll, d[1][3]=3ll; // initial matrix, a_3, a_2, a_1 // n<=3 特判 if (n<=3) {printf("%d\n", d[1][4-n]); return 0; } // 矩陣快速冪 int K=n-3; while (K>0){ if (K&1) { // (b) *= (p) memset(t, 0, sizeof t); for (int i=1; i<=3; i++) for (int j=1; j<=3; j++) for (int k=1; k<=3; k++) t[i][j]=(t[i][j]+b[i][k]*p[k][j]) % mod; memcpy(b, t, sizeof b); } // (p) = (p)^2 memset(t, 0, sizeof t); for (int i=1; i<=3; i++) for (int j=1; j<=3; j++) for (int k=1; k<=3; k++) t[i][j]=(t[i][j]+p[i][k]*p[k][j]) % mod; memcpy(p, t, sizeof p); K>>=1; } // [t] = [d] * (b) memset(t, 0, sizeof t); for (int i=1; i<=3; i++) for (int j=1; j<=3; j++) t[1][i]=(t[1][i]+d[1][j]*b[j][i]) % mod; printf("%lld\n", t[1][1]);