Description
Input
The first line of input gives the number of cases, T. T test cases follow, each on a separate line. Each test case contains one positive integer n. (1 <= n <= 10^9)
Output
For each input case, you should output the answer in one line.
Sample Input
3 1 2 5
Sample Output
9 97 841
题意:求式子的值
思路:借鉴GG 的一张图
#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;
}