题目链接
我们现在想知道f(n)的值。
由于这里的n很大,说明我们肯定是不能用暴力来整的,于是矩阵快速幂咯。
于是,我们可以列写出中间的传递矩阵了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const ll mod = 2147493647; //并不是INT_MAX,要更大
ll N, a, b;
struct matrice
{
ll a[7][7];
matrice() { memset(a, 0, sizeof(a)); }
friend matrice operator * (matrice x, matrice y) //重载函数,矩阵的乘积得到的新矩阵
{
matrice ans;
for(int i=0; i<=6; i++)
{
for(int j=0; j<=6; j++)
{
ll tmp = 0;
for(int k=0; k<=6; k++)
{
tmp=(tmp + x.a[i][k] * y.a[k][j]) % mod; //最后得到的需要取mod
}
ans.a[i][j] = tmp;
}
}
return ans;
}
void OUT() { for(int i=0; i<=6; i++) for(int j=0; j<=6; j++) printf("%lld ", a[i][j]); puts(""); }
}Bas, AI, Want;
matrice fast_mi(matrice x, ll ti)
{
matrice ans;
for(int i=0; i<=6; i++) ans.a[i][i] = 1; //构造单位阵
while(ti)
{
if(ti & 1) ans = ans * x;
x = x * x;
ti >>= 1;
}
return ans;
}
inline void init()
{
Bas = matrice();
Bas.a[0][1] = 1;
Bas.a[1][0] = 2; Bas.a[1][1] = 1; Bas.a[1][2] = 1;
Bas.a[2][2] = 1; Bas.a[2][3] = 4; Bas.a[2][4] = 6; Bas.a[2][5] = 4; Bas.a[2][6] = 1;
Bas.a[3][3] = 1; Bas.a[3][4] = 3; Bas.a[3][5] = 3; Bas.a[3][6] = 1;
Bas.a[4][4] = 1; Bas.a[4][5] = 2; Bas.a[4][6] = 1;
Bas.a[5][5] = 1; Bas.a[5][6] = 1;
Bas.a[6][6] = 1;
AI = matrice();
AI.a[0][0] = a;
AI.a[1][0] = b;
AI.a[2][0] = 81;
AI.a[3][0] = 27;
AI.a[4][0] = 9;
AI.a[5][0] = 3;
AI.a[6][0] = 1;
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%lld%lld%lld", &N, &a, &b);
if(N == 1) { printf("%lld\n", a % mod); continue; }
else if(N == 2) { printf("%lld\n", b % mod); continue; }
init();
Bas = fast_mi(Bas, N - 1);
Want = Bas * AI;
printf("%lld\n", Want.a[0][0]);
}
return 0;
}