1.题目链接。题意:a[n]=a[n-1]+2*a[n-2]+pow(n,4).求an。
2.十分裸的矩阵快速幂,构造个7*7的矩阵就完事了,在对n^4狗杂矩阵时其实很简单,就按照他们的二项展开式的系数填就行了。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 100;
#define ll long long
const ll mod = 2147493647;
const int LEN = 7;
struct Sarray {
int len;
ll data[LEN][LEN];
Sarray(int len, int flag) :len(len)
{
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++)data[i][j] = 0;
data[i][i] = flag;
}
}
Sarray operator *(const Sarray& a) {
Sarray tem(a.len, 0);
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
for (int k = 0; k < len; k++) {
tem.data[i][j] = (tem.data[i][j] + data[i][k] * a.data[k][j]) % mod;
}
}
}
return tem;
}
Sarray operator +(const Sarray& a) {
Sarray tem(a.len, 0);
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
tem.data[i][j] = (data[i][j] + a.data[i][j]) % mod;
}
}
return tem;
}
};
Sarray qpow(Sarray a, int b) {//会更改a,不能按引用传递
Sarray tem(a.len, 1);
while (b) {
if (b & 1)tem = a * tem;
a = a * a;
b >>= 1;
}
return tem;
}
ll tr[7][7] =
{
1,2,1,4,6,4,1,
1,0,0,0,0,0,0,
0,0,1,4,6,4,1,
0,0,0,1,3,3,1,
0,0,0,0,1,2,1,
0,0,0,0,0,1,1,
0,0,0,0,0,0,1
};
ll init[7][7]
{
0,0,0,0,0,0,0,
0,0,0,0,0,0,0,
16,0,0,0,0,0,0,
8,0,0,0,0,0,0,
4,0,0,0,0,0,0,
2,0,0,0,0,0,0,
1,0,0,0,0,0,0
};
int main()
{
int T;
scanf("%d", &T);
Sarray trans(7, 0);
memcpy(trans.data, tr, sizeof(tr));
Sarray ini(7, 0);
memcpy(ini.data, init, sizeof(init));
while (T--)
{
int n, a, b;
scanf("%d%d%d", &n, &a, &b);
if (n == 1)
{
printf("%d\n", a);
continue;
}
if (n == 2)
{
printf("%d\n", b);
continue;
}
ini.data[0][0] = b;
ini.data[1][0] = a;
int ans = (qpow(trans, n - 2) * ini).data[0][0];
ans %= mod;
printf("%d\n", ans);
}
return 0;
}