热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2016年10月25日数学考试:斐波那契数列与矩阵快速幂的应用

本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。

本次考试时间为2016年10月25日上午7:50至11:15,题目涵盖了数学专题,尤其是斐波那契数列的相关内容。以下是详细的题目解析和解题思路。

试题包:下载链接

题目:查看PDF

第一题:斐波那契数列的gcd性质

题目描述略显复杂,但核心在于利用斐波那契数列的性质求解gcd问题。通过观察数据,可以发现gcd(f[i], f[j]) = f[gcd(i, j)]。根据这个规律,我们可以使用矩阵快速幂来高效计算斐波那契数列。

1. 我们先来看看几个有关斐波那契数列的引理。
Gcd(F[n+1],F[n])=1;
F[m+n]=F[m-1]F[n]+F[m]F[n+1];
Gcd(F[n+m],F[n])=Gcd(F[n],F[m]);
由以上三个引理有:Gcd(F[n],F[m])=F[Gcd(n,m)];

证明略,具体实现如下:

#include 
#include
#include

const int mod = 19491001;
int n;
int tx, ty;

struct data {
long long x1, x2, x3, x4;
data (long long x1 = 1, long long x2 = 0, long long x3 = 0, long long x4 = 1) : x1(x1), x2(x2), x3(x3), x4(x4) {};
};

int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}

data operator * (data a, data b) {
data c;
c.x1 = (a.x1 * b.x1 + a.x2 * b.x3) % mod;
c.x2 = (a.x1 * b.x2 + a.x2 * b.x4) % mod;
c.x3 = (a.x3 * b.x1 + a.x4 * b.x3) % mod;
c.x4 = (a.x3 * b.x2 + a.x4 * b.x4) % mod;
return (c);
}

data qpow(data x, int v) {
data ans;
while (v > 0) {
if (v & 1) ans = ans * x;
x = x * x;
v >>= 1;
}
return (ans);
}

int main () {
freopen("fibonacci.in", "r", stdin);
freopen("fibonacci.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d %d", &tx, &ty);
int ans = gcd(tx, ty);
data cur(0, 1, 1, 1);
cur = qpow(cur, ans - 2);
long long tans = ((cur.x2 + cur.x4) % mod + mod) % mod;
printf("%I64d\n", tans);
}
return 0;
}

该题代码实现较为复杂,主要是矩阵乘法的实现不够简洁,后续可以优化。

第二题:黄金分割与斐波那契数列

题目要求找到最接近黄金分割数的两个斐波那契数的比例。通过打表发现,对于较大的n,直接使用斐波那契数列即可解决问题。具体实现如下:

#include 
#include
#include

unsigned long long f[100];
unsigned long long n;

int main () {
freopen("gold.in", "r", stdin);
freopen("gold.out", "w", stdout);
f[1] = 1;
f[2] = 1;
for (int i = 3; i <= 93; i++) f[i] = f[i-1] + f[i-2];
f[94] = 0 - 1;
//for (int i = 1; i <= 94; i++) printf("%I64u\n", f[i]);
scanf("%I64u", &n);
for (int i = 2; i <= 93; i++) {
if (f[i] <= n && f[i+1] > n) {
printf("%I64u/%I64u\n", f[i-1], f[i]);
}
}
return 0;
}

该题的关键在于理解斐波那契数列与黄金分割的关系,通过打表验证后,可以直接得出结论。

第三题:哈希表与LCP

题目要求对每个号码进行变化并存入哈希表中,之后进行判重和暴力LCP计算。具体实现尚未完成,预计得分较低。标答如下:

首先枚举每一个号码,将它按照题目中所给的允许变化的方案进行变化,将变化结果存在哈希表里,之后利用哈希进行判重,如果出现变化后的值与变化前的相同,对两个点进行暴力LCP并连边,最后使用SPFA求解。

第四题:行列互不影响的纸牌问题

题目描述为行列之间的关系,实际上是一个环形均分纸牌问题。设每行1的个数为n堆纸牌,每列1的个数为m堆纸牌,最终目标是使每一行和每一列的纸牌数量相等。

方法一:枚举从第k个位置开始,依次向后推,最后取最小值。时间复杂度O(n^2),预计得分70分。

方法二:设bi的前缀和为si,当sk是s1~sn中位数时,上式有最小值。把si排序后,令sk=s[(n+1)/2],计算代价即可。时间复杂度O(nlogn),预计得分100分。


推荐阅读
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 数据结构入门:栈的基本概念与操作
    本文详细介绍了栈这一重要的数据结构,包括其基本概念、顺序存储结构、栈的基本操作(如入栈、出栈、清空栈和销毁栈),以及如何利用栈实现二进制到十进制的转换。通过具体代码示例,帮助读者更好地理解和应用栈的相关知识。 ... [详细]
author-avatar
llllllw_wlllllll
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有