gym 101512 BAPC 2014 I Interesting Integers

2023-11-19

Problem

codeforces.com/gym/101512/attachments
vjudge.net/contest/186506#problem/I

Meaning

给出一个 正整数 n,要找尽量小的 a 和 b(a < b),使得 n 是以 a 和 b 作为头两项的斐波那契数列的某一项。

Analysis

当 a = b = 1 时,数列增长得最慢,然而即使这样,第 45 项也已经超过 109 ,意味着 n 项数在 45 以内。
对于斐波那契数列的第 k 项,可以把它写成头两项的线性表达式:fib[k] = c1 * fib[1] + c2 * fib[2]。而当项数 k 固定下来,系数c1 和 c2 也就是固定的常数了(可以从用矩阵快速幂求斐波那契数列第 k 项的做法理解)。
列出斐波那契数列前几条递推式,不难发现系数 c1 和 c2 规律:c1 = fib[k-2]c2 = fib[k-1],所以有:fib[k] = fib[k-2] * f[1] + fib[k-1] * fib[2]
枚举项数 k,求解c1 * x + c2 * y = n,相当于找直线上的整点。其中 x 和 y 分别就是所求的 a 和 b 的候选解。
因为要满足 a > 0、b > 0、a < b,而求出的 x 和 y 不一定满足这三个条件,要先做一些偏移,使整点(x,y)移动到直线y = x上方,然后再更新答案。

Code

#include <iostream>
using namespace std;
const int N = 1e9, TERM = 45;

int fib[TERM+1];

void table()
{
    fib[0] = 0;
    fib[1] = 1;
    for(int i = 2; i <= TERM; ++i)
        fib[i] = fib[i-1] + fib[i-2];
}

long long extgcd(long long a, long long b, long long &x, long long &y)
{
    long long d = a;
    if(b)
    {
        d = extgcd(b, a % b, y, x);
        y -= (a / b) * x;
    }
    else
    {
        x = 1;
        y = 0;
    }
    return d;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    table();
    int T;
    cin >> T;
    while(T--)
    {
        int n;
        cin >> n;
        int a = 1, b = n - 1;
        for(int t = TERM; t > 2; --t)
        {
            long long x, y, k,
                // x 的系数、y 的系数
                fa = fib[t-2], fb = fib[t-1],
                // 求解 fa * x + fb * y = gcd(fa, fb)
                g = extgcd(fa, fb, x, y);
            // gcd(fa, fb) 不整除 n
            // 则方程无解
            if(n % g)
                continue;
            // 方程两边同乘 n / gcd(fa, fb)
            // 即得 fa * x + fb * y = n 的解 (x,y)
            x *= n / g;
            y *= n / g;
            // 整点移动时的增量
            // x 的增量是 fb
            // y 的增量是 fa
            fa /= g;
            fb /= g;
            // 把整点移到 y = x 上方
            // 即 x - k * fb <= y + k * fa
            if(x > y)
            {
                k = (x - y + fa + fb - 1) / (fa + fb);
                x -= k * fb;
                y += k * fa;
            }
            // 保证整点在 y = x 上方的前提下
            // 尽量地往下移,以得到最小的 y
            // y - k * fa >= x + k * fb
            k = (y - x) / (fa + fb);
            x += k * fb;
            y -= k * fa;
            // 更新答案
            if(x > 0 && y > 0)
            {
                if(b > y)
                    a = x, b = y;
                else if(b == y && a > x)
                    a = x, b = y;
            }
        }
        cout << a << ' ' << b << '\n';
    }
    return 0;
}

Post Script

fib[1] = a
fib[2] = b
fib[3] = a + b
fib[4] = fib[2] + fib[3] = a + 2b
fib[5] = fib[3] + fib[4] = 2a + 3b
fib[6] = fib[4] + fib[5] = 3a + 5b
fib[7] = fib[5] + fib[6] = 5a + 8b
……
fib[n] = fib[n-2] * a + fib[n-1] * b
fib[n] = fib[n-2] * fib[1] + fib[n-1] * fib[2]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gym 101512 BAPC 2014 I Interesting Integers 的相关文章

  • ACM--田忌赛马--贪心--HDOJ 1052--Tian Ji -- The Horse Racing

    HDOJ题目地址 传送门 Tian Ji The Horse Racing Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total S
  • arctan函数加上90°;arctan(a/b)与arctan(b/a)的关系

  • gym 101505 CTU Open Contest 2016 G Orchard Division

    Problem codeforces com gym 101505 attachments vjudge net contest 187874 problem G Meaning 一个 m m 的网格 长 宽下标 0 m 1 里有 n 个点
  • ACM学习计划

    看完人家的博客 发现任重道远 一位高手对我的建议 一般要做到50行以内的程序不用调试 100行以内的二分钟内调试成功 acm主要是考算法的 主要时间是花在思考算法上 不是花在写程序与debug上 下面给个计划你练练 第一阶段 练经典常用算法
  • ACM: Poker Game

    题目描述 A poker deck contains 52 cards Each card has a suit of either clubs diamonds hearts or spades denoted C D H S in th
  • 关于suitesparse在windows平台下速度极慢以及奇奇怪怪的问题解决

    前言 好像suitesparse原本没有windows版本 然后国外一个大佬写了cmake搞出来的 所以可能存在一些奇奇怪怪的问题吧 主要是一下两点 1 windows相比linux环境速度奇慢 2 新手编译这个库经常会下载suitespa
  • hdu 5792 World is Exploding 2016 Multi-University 5

    Problem acm hdu edu cn showproblem php pid 5792 题意 给一个序列 V 问有多少个由下标组成的四元组 a b c d 满足 a b c d a lt b c lt d Va lt Vb Vc g
  • 数的划分(递归)

    整数划分是另外的问题 题目描述 Description 将整数n分成k份 且每份不能为空 任意两种划分方案不能相同 不考虑顺序 例如 n 7 k 3 下面三种划分方案被认为是相同的 7 1 1 5 7 1 5 1 7 5 1 1 问有多少种
  • 生态系统过程模型

    生态系统过程模型 根据生态系统的生理生态学特性 结合影响生态系统过程的观测指标 提出的能够反映生态系统过程的机制模型 统计模型 stochasticmodel statisticmodel probabilitymodel 指以概率论为基础
  • 为什么样本方差里面要除以(n-1)而不是n?

    前段日子重新整理了一下这个问题的解答 跟大家分享一下 如果有什么错误的话希望大家能够提出来 我会及时改正的 话不多说进入正题 首先 我们来看一下样本方差的计算公式 刚开始接触这个公式的话可能会有一个疑问就是 为什么样本方差要除以 n 1 而
  • 哈夫曼编码最大编码长度

    概念 层数 叶子节点为待编码的数据 根为第0层 编码长度 第 L L L层数据编码后的长度为 L L L 节点概率 若节点为叶子节点 则概率为叶子所编码数据的频率
  • 容斥原理——经典例题(组合数学)

    一 容斥原理 就是人们为了不重复计算重叠部分 想出的一种不重复计算的方法 先来认识一下这两个符号 与 如图 蓝色的圈就是c1c2 红色的圈围起来的就是c1c2 二 例题 组合数学 1 题目 1 1 题目描述 八是个很有趣的数字啊 八 发 八
  • 介值定理究竟在讲什么?

    介值定理 书本上的定义 翻译成人话就是 函数最原始的定义 我们初中就知道 一个函数最根本的性质就是 函数值 自变量值 一一对应 所以介值定理就是在反复说一件事 一个数如果属于值域 在定义域内 一定能够找到一个 自变量 与其对应 当然这个结论
  • UVa 12504 Updating a Dictionary

    Problem uva onlinejudge org index php option com onlinejudge Itemid 8 page show problem problem 3948 题意 貌似是模拟 Source Cod
  • 06. 计数原理

    6 计数原理 6 1 分类加法计数原理与分步乘法计数原理 分类加法计数原理定义 完成一件事 有 n n n 类办法 在第1类办法中有 m 1 m 1
  • 18. 线性代数 - 线性变换

    文章目录 线性空间 线性变换 线性变换的几何意义 特征值与特征向量 NumPy的矩阵操作 Hi 你好 我是茶桁 经历了几节线性代数课程之后 终于咱们到了最后一节课了 本节课的内容说多不多 说少也不少 我们先是要理解一下线性空间和线性变换 并
  • kuangbin的模板

    直接链接 间接链接
  • 【华为OD机试真题 python】数字加减游戏【2022 Q4

    题目描述 数字加减游戏 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 在每个回合中 小明可以用当前的数字加上或减去一个数字 现在有两种数字可以用来加减 分别为a b a b 其中b没有使用次数限制 请问小明最少可以用
  • 离散数学知识点-期末复习

    目录 一 利用真值表求主析取范式 主合取范式 1 例题 二 推理证明 1 推理规则 2 例题 三 符号化命题 四 有穷集的计数 1 包含互斥原理 2 例题 1 文氏图法 2 包含互斥原理法 五 关系的闭包 1 三种闭包 2 Warshall
  • Codeforces Round 915 (Div. 2) A-F(补题&补写法)

    A Constructive Problems 签到 题解 输出max x y t int input for in range t u v map int input split print max u v B Begginer s Ze

随机推荐

  • 【os模块】os.walk 获取指定路径下文件名

    os walk函数原型 os walk是python中的一个函数 函数声明 os walk top topdown True nerr r None top 目标路径 topdown 默认值是 True 表示首先返回顶级目录下的文件 然后再
  • c++ Sigmoid/Softmax/Argmax

    Sigmoid float sigmoid float x return 1 1 exp x float sigmoid dy dz float x return x 1 0 x float tanh dy dz float x retur
  • ES按日期滚动索引

    按日期滚动索引 环境 ES 6 9 ES 7 Centos 7 配置过程 创建索引 PUT localhost 9200 index 20210915 设置索引别名 写入别名和读取别名 PUT localhost 9200 index 20
  • 网络 -- n/24 计算IP范围

    1 IP地址 共分为四类 A B C D类 A类 从1 0 0 0 到 126 255 255 255 B类 从128 0 0 0 到 191 255 255 255 C类 从192 0 0 0 到 223 255 255 255 其中12
  • 关于输入、输出电容在 LDO 应用中的重要性

    关于输入 输出电容在 LDO 应用中的重要性 如何让LDO 产品在应用中达到更佳的稳定性 则用户在设计电路时 最好根据芯片 datasheet 的说明文档而定 下面以LP2985 3 3这个LDO为例 LP2985 3 3是低功耗 低压差
  • Vue基础(二)——模板语法

    一 指令 1 v bind 绑定属性 2 v on 绑定事件 3 v if和v show 1 介绍
  • tcp/ip在物理层/数据链路层 实现简单抓包

    socket的精妙之处在于协议族的横向转换和地址族的纵向转换 我们也可在更底层实现对流经host的数据流的监督和修改 尤其是监察数据 十分简单 这里是混杂模式实现对ip数据流的监察与对tcp数据流的简单查看 需要root权限 这里忽略了tc
  • 整理一下go的ci工具

    代码格式化 go fmt fileName go goimports 自动格式化import goimports w fileName go mod 自动更新 删除包 go mod tidy 检查注释是否符合导出 1 安装revive go
  • 关于如何修复烧写镜像文件失败的SD卡

    前言 使用某些软件 比如 win32 Disk Imager 向SD卡烧写镜像文件时 很有可能出现烧写失败的情况 通常如果烧写失败 系统会弹出请求格式化SD卡的提示框 此时不要点格式化 点了可能会造成不可挽救的结果 也可能不会 而是进行以下
  • 【C库函数】memcpy函数详解

    目录 memcpy 函数原型 参数讲解 返回值讲解 函数讲解 三个注意点 memcpy 拷贝内存块到目标空间 函数原型 void memcpy void dest const void src size t count 参数讲解 参数 de
  • 百度AI──自然语言处理使用教程

    百度AI 自然语言处理使用教程 情感倾向分析 创建自己的应用 python方式调用 安装Python SDK 创建一个 Python SDK客户端 配置AipNlp 调用接口 情感倾向分析 需要注意的几个点 完整代码 参考 创建自己的应用
  • Linux 配置 PaddleOCR环境

    配置环境 1 准备好CUDA和cudnn 安培架构GPU需配置CUDA 11 2 CUDNN 8 1 1 以下文档以安培架构GPU的为例 找到对应的版本下载CUDA https developer nvidia com cuda downl
  • 一位数组返回id和pid通过这两个参数转换为树形结构数据,和树形结构的渲染

    废话不多说直接上代码 html代码我是引用了一个jq的插件作为样式插件名字为 jOrgChart 具体内容大家可以评论到下方 div class com div class TheEditor 编辑 div div div div js代码
  • Java 实体设置指定日期格式

    import com fasterxml jackson annotation JsonFormat JsonFormat pattern yyyy MM dd HH mm ss timezone GMT 8 private Date cr
  • nginx 代理图片服务器

    location gif jpg jpeg png expires 24h root home sk ftp 指定图片存放路径 proxy store on proxy store access user rw group rw all r
  • MATLAB BP神经网络 笔记整理

    1 如何更改输出层的激活函数 传递函数 对于有两层神经网络结构 可以通过调用以下函数 net layers 1 or 2 transferFcn for the hidden net layers 3 transferFcn for the
  • C#实现遍历文件夹获取指定后缀名文件

    问题描述 项目需要 要进行某文件夹下所有shp数据的读取 解决方法 using System using System Collections Generic using System ComponentModel using System
  • Python机器学习/数据挖掘项目实战 波士顿房价预测 回归分析

    Python机器学习 数据挖掘项目实战 波士顿房价预测 回归分析 此数据源于美国某经济学杂志上 分析研究波士顿房价 Boston HousePrice 的数据集 在这个项目中 你将利用马萨诸塞州波士顿郊区的房屋信息数据训练和测试一个模型 并
  • Qt之一个类成员函数调用另一个类成员的方法

    原文 https blog csdn net qq 35721743 article details 83592415 在继承之外 在C 中一个类成员函数调用另一个类成员的方法主要有 类的组合 友元类 类的前向声明 单例模式等 下面主要讲讲
  • gym 101512 BAPC 2014 I Interesting Integers

    Problem codeforces com gym 101512 attachments vjudge net contest 186506 problem I Meaning 给出一个 正整数 n 要找尽量小的 a 和 b a lt b