描述
桃子得到了一个递推式,f(n)=2*f(n-2)+f(n-1)+n^4,f(1)=a,f(2)=b,现在给你n,a,b,要你计算f(n)的值为多少。
输入
第一行一个整数T(T=100),表示有T组数据。
对于每组数据,第一行三个整数n(1≤n≤2^31),a(1≤a≤2^31),b(1≤b≤2^31)。
输出
对于每组数据输出一个数即f(n)的值,由于这个数会很大,你需要输出f(n)%2147493647后的值。
样例输入
2
3 1 2
4 1 10
样例输出
85
369
提示
第一个样例:第三个数字85=2*1+2+3^4。
第二个样例:第三个数字93=2*1+10+3^4,第四个数字369=2*10+93+4^4。
如题目所写的矩阵快速幂,f的部分直接写了,主要是(n+1)^4怎么由n^4转化过来。
(n+1)^4 = n^4+4*n^3+6*n^2+4*n+1
可见还需要n^3,n^2,n。
(n+1)^3 = n^3+3*n^2+3*n+1
(n+1)^2 = n^2+2*n^1+1
所以可以得到矩阵[a, b, 16, 8, 4, 2, 1],再矩阵快速幂就可以得到答案。
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 7, mod = 2147493647;
int n, m;
void mul(int c[][N], int a[][N], int b[][N]) {
int t[N][N];
memset(t, 0, sizeof t);
for(int i = 0;i < N;i ++) {
for(int j = 0;j < N;j ++) {
for(int k = 0;k < N;k ++) {
t[i][j] = (t[i][j] + (a[i][k] * b[k][j]) % mod) % mod;
}
}
}
memcpy(c, t, sizeof t);
}
signed main() {
int cas;
cin >> cas;
while(cas --) {
int x, y;
cin >> n >> x >> y;
if(n == 1) {
cout << x << '\n';
continue;
}else if(n == 2) {
cout << y << '\n';
continue;
}
int res[N][N] = {x, y, 16, 8, 4, 2, 1};
int a[N][N] = {
{0, 2, 0, 0, 0, 0, 0},
{1, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 0, 0, 0, 0},
{0, 4, 4, 1, 0, 0, 0},
{0, 6, 6, 3, 1, 0, 0},
{0, 4, 4, 3, 2, 1, 0},
{0, 1, 1, 1, 1, 1, 1},
};
n -= 2;
while(n) {
if(n & 1) mul(res, res, a);
mul(a, a, a);
n >>= 1;
}
cout << res[0][1] << '\n';
}
return 0;
}