HDU 2256 Problem of Precision (矩阵快速幂)

时间:2023-03-10 01:49:48
HDU 2256 Problem of Precision (矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2256

最重要的是构建递推式,下面的图是盗来的。貌似这种叫共轭数。

HDU 2256 Problem of Precision (矩阵快速幂)

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int mod = ;
struct data {
int mat[][];
data() {}
data(int x, int y, int z1 = , int z2 = ) {
mat[][] = x, mat[][] = y;
mat[][] = z1, mat[][] = z2;
}
}; data operator* (data a, data b) {
data ans;
for(int i = ; i <= ; ++i) {
for(int j = ; j <= ; ++j) {
ans.mat[i][j] = ;
for(int k = ; k <= ; ++k)
ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][k] * b.mat[k][j] % mod) % mod;
}
}
return ans;
} data operator^ (data a, int n) {
data ans;
for(int i = ; i <= ; ++i) {
for(int j = ; j <= ; ++j) {
ans.mat[i][j] = (i == j);
}
}
while(n) {
if(n & )
ans = ans * a;
a = a * a;
n >>= ;
}
return ans;
} int main()
{
int t, n;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
data ans(, );
data a(, , , );
a = a ^ (n - );
ans = ans * a;
printf("%d\n", (ans.mat[][] * - + mod) % mod);
}
return ;
}