洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)

https://www.luogu.org/problemnew/show/P1775

题目描述

门打开了,里面果然是个很大的厅堂。但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有。难道这就是王室的遗产?小FF不信,他仔细阅读了羊皮纸上的内容后发现,里面书写的古代人一直没能解出的难题,解除这道题目的人只要将答案用石笔写到这张羊皮纸上就能到达王室的宝藏室了。而当小FF拿起石笔后,刚刚打开的巨石门突然关上了;这时小FF意识到原来那几具骷髅是在他之前到这里的冒险者,恐怕是因为没能破解这道题而困死在这里了。小FF越想越害怕,急忙联系到了你,为了能保命,他甚至愿意和你五五分……看来你不得不再次帮他了。羊皮纸上的问题如下:已知x,y为整数,且满足以下两个条件:

1.x,y∈[1…k],且x,y,k∈Z

2.(x^2-xy-y^2)^2=1

给你一个整数k,求一组满足上述条件的x,y并且使得x^2+y^2的值最大。

小FF得到答案后,用石笔将答案书写在羊皮纸上,那么就能到达王室的遗产所在地了。

输入输出格式

输入格式:

 

输出文件仅一行,两个整数;两个整数分别表示x和y。x,y之间用一个空格隔开。

 

输出格式:

 

一个整数k

 

输入输出样例

输入样例#1: 复制
1995
输出样例#1: 复制
1597  987

说明

对于30%的数据:2≤k≤10^4。

对于100%的数据:2≤k≤10^18。

 

 

打表找规律。发现和斐波那契数列有关

 1 #include <cstring>
 2 #include <cstdio>
 3 
 4 int k,x,y;
 5 
 6 void Work()
 7 {
 8     int px=0,py=0,maxx=-1;
 9     for(x=1; x<=k; ++x) 
10       for(y=1; y<=k; ++y)
11         if(x*x+y*y>maxx&&((x*x-x*y-y*y)*(x*x-x*y-y*y)==1))
12             px=x,py=y,maxx=x*x+y*y;
13     printf("%d : %d %d\n",k,px,py);
14 }
15 
16 int main()
17 {
18     freopen("out.txt","w",stdout);
19     for(k=1; k<=500; ++k) Work();
20     return 0;
21 }
表。。
 1 #include <cstdio>
 2 
 3 inline void read(long long &x)
 4 {
 5     x=0; register char ch=getchar();
 6     for(; ch>'9'||ch<'0'; ) ch=getchar();
 7     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
 8 }
 9 
10 long long x,y,k,t;
11 
12 int Presist()
13 {
14     read(k);
15     for(y=1; y<=k; )
16         t=x,x=y,y=t+x;
17     printf("%I64d %I64d\n",x,t);
18     return 0;
19 }
20 
21 int Aptal=Presist();
22 int main(int argc,char**argv){;}

 

posted @ 2017-11-19 18:06  Aptal丶  阅读(170)  评论(0编辑  收藏  举报