热门标签 | 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分。


推荐阅读
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 在现代Web应用中,当用户滚动到页面底部时,自动加载更多内容的功能变得越来越普遍。这种无刷新加载技术不仅提升了用户体验,还优化了页面性能。本文将探讨如何实现这一功能,并介绍一些实际应用案例。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
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社区 版权所有