[题解]CF457A Golden System
十分精妙的一道题,斐波那契数列和黄金比例\(\Phi\)的内在有着奇妙的联系。
我们设\(x=\frac{\sqrt{5}+1}{2}\),则根据题目给出的规律,有\(x^2=x+1\)。
下面我们通过列举,试图找出规律:
- \(x^0=1\)
- \(x^1=x\)
- \(x^2=x+1\)
- \(x^3=2x+1\)
- \(x^4=3x+2\)
- \(x^5=5x+3\)
- \(x^6=8x+5\)
\(…\)
没错,\(x\)的系数构成了一个斐波那契数列\(\{1,0,1,1,2,3,5,8,…\}\),而容易发现\(x^k=x^{k-1}+x^{k-2}\)。所以我们把\(A,B\)序列不断降次,直到只剩若干\(x^0\)和\(x^1\),然后计算具体值判断即可。
这里把\(A,B\)相减得到\(C\),最后看结果的正负性,效果是一样的。
需要注意的是,降次过程中可能会出现超long long
的情况,怎么解决呢?我们发现\(x^k\)的系数如果超过某个限制,以至于\(1\sim (k-1)\)即使全是负数,结果也减不到负数。所以在执行途中加一个判断如果\(x^k\)的绝对值大于某个数,就直接输出。这里使用\(10^5\)过了,但为了保险还是大点好。
点击查看代码
#include<bits/stdc++.h> using namespace std; string a,b; long long c[100010]; int main(){ cin>>a>>b; int len=max(a.size(),b.size()); reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); a.resize(len,'0'),b.resize(len,'0'); a=' '+a,b=' '+b; for(int i=1;i<=len;i++) c[i]=a[i]-b[i]; for(int i=len;i>=3;i--){ if(llabs(c[i])>100000){ if(c[i]>0) cout<<'>'; else cout<<'<'; return 0; } c[i-1]+=c[i],c[i-2]+=c[i]; } if(c[1]==c[2]&&c[1]==0){ cout<<'='; return 0; } double x=(sqrt(5)+1)/2; double aa=1.0*c[2]*x+1.0*c[1]; if(aa>0) cout<<'>'; else cout<<'<'; return 0; }
分类:
题解
标签:
Codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效