HDU 2256 Problem of Precision

本文提供了一种使用矩阵快速幂的方法来解决 HDU 2256 的问题。通过将问题转化为 an + bn * sqrt(6) 的形式,再进一步转化为矩阵运算,最终实现了高效的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2256

这个题目是求

直接求有些麻烦,但是我们可以转换下成这个形式这样你会发现他可以转化成 an+bn*sqrt(6)的形式


然后就会发现它可以转化为矩阵了。



最后代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int Mod = 1024;
struct martix{
	int M[2][2];
	void zero(){
		memset(M,0,sizeof(M));
	}
	void unit(){
		this->zero();
		for(int i = 0; i < 2; i++)
			M[i][i] = 1;
	}
};
martix operator * (martix A,martix B){
	martix res;
	res.zero();
	for(int i = 0; i < 2; i++)
		for(int k = 0; k < 2; k++)
			for(int j = 0; j < 2; j++){
				res.M[i][j] += (A.M[i][k]*B.M[k][j])%Mod;
				res.M[i][j] = (res.M[i][j]+Mod)%Mod;
			}
	return res;
}
martix operator ^ (martix A,int N){
	martix res;
	res.unit();
	while(N){
		if(N & 1)res = res*A;
		A = A*A;
		N >>= 1;
	}
	return res;
}
int main(){
	int T,n;
	scanf("%d",&T);
	martix P,F,Ans;
	P.zero();
	P.M[0][0] = 5;P.M[0][1] = 12;
	P.M[1][0] = 2;P.M[1][1] = 5;
	F.zero();
	F.M[0][0] = 5;
	F.M[1][0] = 2;
	while(T--){
		scanf("%d",&n);
		Ans.zero();
		Ans = P^(n-1);
		Ans = Ans*F;
		printf("%d\n",(2*Ans.M[0][0]-1)%Mod);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值