Loading [MathJax]/jax/output/CommonHTML/autoload/mtable.js

【HDU3117】Fibonacci Numbers

【HDU3117】Fibonacci Numbers

题面

求斐波那契数列的第nn项的前四位及后四位。

其中0n<2320n<232

题解

前置知识:线性常系数齐次递推

其实后四位还是比较好求,矩阵快速幂就可以了,主要是前四位。

先用线性常系数齐次递推求出斐波那契数列的通项公式

fn=55((1+52)n(152)n)fn=55((1+52)n(152)n)

因为数列的前3939项我们还是存的下的,所以我们只考虑n40n40的情况

考虑到n40n4055(152)n55(152)n是个很小的东西,可以不考虑它的影响

那么我们就是要求

55(1+52)n55(1+52)n

现在先考虑这样一个式子,数xx用科学计数法表示

x=t10kx=t10k

那么xx的前四位即为tt的前四位,我们将xx取个常用对数

lgx=lgt+klgx=lgt+k

类比上式以及我们要求的式子:

y=lg(55(1+52)n)=lg55+lg(1+52)n=lg55+n×lg1+52

那么lgt=yy,最后1000×10y的整数部分就是答案。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring> 
#include <cmath> 
#include <algorithm>
using namespace std; 
const int Mod = 1e4; 
struct Matrix { 
	int m[2][2]; 
	Matrix() { memset(m, 0, sizeof(m)); } 
	void init() { for (int i = 0; i < 2; i++) m[i][i] = 1; } 
	int *operator [] (int id) { return m[id]; } 
	Matrix operator * (const Matrix &b) { 
		Matrix res; 
		for (int i = 0; i < 2; i++) 
			for (int j = 0; j < 2; j++) 
				for (int k = 0; k < 2; k++) 
					res[i][j] = (res[i][j] + m[i][k] * b.m[k][j] % Mod) % Mod; 
		return res; 
	} 
} ; 
int N, f[40];
int TASK1() { 
	double s = log10(sqrt(5.0) / 5.0) + 1.0 * N * log10((1.0 + sqrt(5.0)) / 2.0); 
	s = s - (int)s; 
	double ans = 1000 * pow(10.0, s); 
	return ans; 
} 
int TASK2() { 
	Matrix S, T, ans; int n = N; ans.init(); 
	S[0][0] = 1; 
	T[0][0] = 1, T[0][1] = 1; 
	T[1][0] = 1, T[1][1] = 0; 
	while (n) { if (n & 1) ans = ans * T; n >>= 1; T = T * T; } 
	S = ans * S; 
	return ans[1][0]; 
} 
int main () { 
	f[0] = 0, f[1] = 1; for (int i = 2; i < 40; i++) f[i] = f[i - 1] + f[i - 2]; 
	while (~scanf("%d", &N)) { 
		if (N < 40) { printf("%d\n", f[N]); continue; } 
		printf("%04d...%04d\n", TASK1(), TASK2()); 
	} 
	return 0; 
} 
C++
posted @   heyujun  阅读(232)  评论(2编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
点击右上角即可分享
微信分享提示