代码:
点击打开链接
推导如下:
首先要明确是构建矩阵,然后是为了避免损失精度,我们不能直接给出x1和y1,因此,需要用到下面的式子
代码:
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> typedef long long ll; using namespace std; const int mod = 1024; const int maxn = 2; struct Matrix { ll v[maxn][maxn]; Matrix() {} Matrix(int x) { init(); for (int i = 0; i < maxn; i++) v[i][i] = x; } void init() { memset(v, 0, sizeof(v)); } Matrix operator *(Matrix const &b) const { Matrix c; c.init(); for (int i = 0; i < maxn; i++) for (int j = 0; j < maxn; j++) for (int k = 0; k < maxn; k++) c.v[i][j] = (c.v[i][j] + (v[i][k]*b.v[k][j])%mod) % mod; return c; } Matrix operator ^(int b) { Matrix a = *this, res(1); while (b) { if (b & 1) res = res*a; a = a*a; b >>= 1; } return res; } } A; int main() { int t, n; scanf("%d", &t); Matrix cnt; cnt.v[0][0] = 5, cnt.v[0][1] = 12, cnt.v[1][0] = 2, cnt.v[1][1] = 5; while (t--) { scanf("%d", &n); Matrix tmp = cnt^(n-1); int ans = (2*(5 * tmp.v[0][0] + 2 * tmp.v[0][1])-1) % mod; printf("%d\n", ans); } return 0; }