P1775 古代人的难题_NOI导刊2010提高(02)
题目描述
门打开了,里面果然是个很大的厅堂。但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有。难道这就是王室的遗产?小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
输入输出样例
说明
对于30%的数据:2≤k≤10^4。
对于100%的数据:2≤k≤10^18。
打表找规律
打出表来以后可以发现第一个值为小于n的最大的斐波那契数,第二个数为次大的斐波那契数
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int ax,ay,k,maxn; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int work() { for(int x=1;x<=k;x++) for(int y=1;y<=k;y++) if(x*x+y*y>maxn&&(x*x-x*y-y*y)*(x*x-x*y-y*y)==1) { maxn=x*x+y*y; ax=x,ay=y; } printf("%d:%d %d\n",k,ax,ay); } int main() { for(k=1;k<=100;k++) work(); return 0; }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 10001000 #define LL long long using namespace std; LL n,f[N],sum; LL read() { LL x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int main() { n=read(); f[0]=f[1]=1,sum++; for(int i=2;;i++) { f[i]=f[i-1]+f[i-2]; if(f[i]>n) break; sum++; } printf("%lld %lld",f[sum],f[sum-1]); return 0; }