hdu 5950 Recursive sequence(矩陣快速冪,構造)
阿新 • • 發佈:2019-01-29
N較大,直接遞推會超時,可以用矩陣快速冪
也是的函式,且
所以在構造的矩陣中維護到
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <cmath> #include <vector> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define FOR(i,k,n) for(int i=k;i<n;i++) #define FORR(i,k,n) for(int i=k;i<=n;i++) #define scan(a) scanf("%d",&a) #define scann(a,b) scanf("%d%d",&a,&b) #define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c) #define mst(a,n) memset(a,n,sizeof(a)) #define ll long long #define N 20 #define Mod 2147493647 #define INF 0x3f3f3f3f const double eps=1e-8; const double pi=acos(-1.0); struct Matrix { ll val[N][N]; int row, col; Matrix(){} Matrix(int row, int col) : row(row), col(col) { zero(); } void zero() { memset(val, 0, sizeof(val)); } void unit() { zero(); row = col = max(row, col); for (int i = 0; i < row; ++i) { val[i][i] = 1; } } Matrix operator*(const Matrix &m) { Matrix ret(this->row, m.col); for (int i = 0; i < this->row; ++i) { for (int k = 0; k < this->col; ++k) { if (this->val[i][k]) // 應付稀疏矩陣 { for (int j = 0; j < m.col; ++j) { ret.val[i][j] += (this->val[i][k] * m.val[k][j]) % Mod; ret.val[i][j] %= Mod; } } } } return ret; } Matrix operator^(const ll k) { Matrix ret((*this).col, (*this).col); ret.unit(); // for (int i = 0; i < (*this).col; ++i) // { // ret.val[i][i] = 1; // } Matrix base = (*this); for (ll e = k; e; e >>= 1) { if (e & 1) { ret = ret * base; } base = base * base; } return ret; } void resize(int row, int col) { this->row = row; this->col = col; } }; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int t; scan(t); while(t--) { int n,a,b; scan(n); scann(a,b); a%=Mod; b%=Mod; if(n==1) { cout<<a<<endl; continue; } if(n==2) { cout<<b<<endl; continue; } Matrix m(7,7); m.val[0][0]=1; m.val[0][1]=2; m.val[0][2]=1; m.val[1][0]=1; m.val[2][2]=1; m.val[2][3]=4; m.val[2][4]=6; m.val[2][5]=4; m.val[2][6]=1; m.val[3][3]=1; m.val[3][4]=3; m.val[3][5]=3; m.val[3][6]=1; m.val[4][4]=1; m.val[4][5]=2; m.val[4][6]=1; m.val[5][5]=1; m.val[5][6]=1; m.val[6][6]=1; m=m^(n-2); Matrix x(7,1); x.val[0][0]=b; x.val[1][0]=a; x.val[2][0]=81; x.val[3][0]=27; x.val[4][0]=9; x.val[5][0]=3; x.val[6][0]=1; x=m*x; cout<<x.val[0][0]<<endl; } return 0; }