博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOI1995】极值问题
阅读量:6534 次
发布时间:2019-06-24

本文共 848 字,大约阅读时间需要 2 分钟。

问题描述

已知m、n为整数,且满足下列两个条件:

    ① m、n∈{1,2,…,k},即1≤m,n≤k

    ②(n2-m*n-m22=1

你的任务是:编程输入正整数k(1≤k≤109),求一组满足上述两个条件的m、n,并且使m2+n2的值最大。例如,从键盘输入k=1995,则输出:m=987   n=1597。

输入格式

一个整数k

输出格式

满足条件且m2+n2最大的m,n

样例输入

1995

样例输出

m=987

n=1597

题解

一个斐波拉契。。。。。

先暴力打个表,把k=1..1995的m,n值打出来,找找规律,顺便检查一下暴力有没有打错。

我看到的题目没有讲清楚(不知道别的题目有没有清楚),但是看样子应该m<=n,那暴力打表就把m在前,n在后输出来,发现m的值有点像斐波拉契,但是每个数都重复了很多次,而n的值就是斐波拉契中m的下一项。所以算出m就能算出n了。

观察一下发现,对于m的值的变化,就是斐波拉契的每一项重复几次,重复的次数就是那一项的值。

于是问题就解决了。

 

#include 
int k,f[1000];int main(){ int i,t; scanf("%d",&k); if (k==1) { printf("m=1\nn=1"); return 0; } if (k==2) { printf("m=1\nn=2"); return 0; } if (k==3) { printf("m=2\nn=3"); return 0; } f[1]=f[2]=1; f[3]=2; i=t=3; while (i
=k) { printf("m=%d\nn=%d",f[t-1],f[t]); break; } i+=f[t-1]; } return 0;}

  

 

转载于:https://www.cnblogs.com/rabbit1103/p/9040224.html

你可能感兴趣的文章
MOXA的智能通信产品也大力支持WinCE.net了
查看>>
ActiveX开发知多少?
查看>>
你不得不知道的Visual Studio 2012(3)- 创建Windows应用程序
查看>>
Android操作系统2.0制作备份
查看>>
To XSS or not ? 杂谈
查看>>
TFTP服务器在Cisco设备上的应用(上传、下载IOS)
查看>>
获得文件和文件夹的所有权
查看>>
烂泥:学习mysql数据库主从同步复制原理
查看>>
Java相对路径读取文件
查看>>
PostgreSQL 商用版本EPAS(阿里云ppas) 自动(postgresql.conf)参数计算与适配功能
查看>>
烂泥:学习ssh之ssh隧道应用
查看>>
Android TableLayout 常用的属性介绍及演示
查看>>
Ajax跨域访问XML数据的另一种方式——使用YQL查询语句
查看>>
[原创]让您的服务器不再有被挂马的烦恼---文件安全卫士
查看>>
流水线和PC指针
查看>>
Fiddler设置抓取https请求
查看>>
div布局小技巧
查看>>
OCP 12c最新考试原题及答案(071-4)
查看>>
MHA故障切换和在线手工切换原理
查看>>
JAVA并发,同步锁性能测试
查看>>