桃子的矩阵快速幂

描述

桃子得到了一个递推式,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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值