51nod 1350 斐波那契表示(递推+找规律)
2024-10-21 06:02:37
传送门
题意
分析
我们发现该数列遵循下列规律:
1
1,2
1,2,2
1,2,2,2,3
1,2,2,2,3,2,3,3
我们令A[i]表示f[i]开始长为f[i-1]的i的最短表示和
那么得到A[i]=A[i-1]+A[i-2]+f[i-2]
那么先预处理出每一段和A[i],i不会超过84
先连续加A[i],对于剩余一段,递归处理,具体见代码
感谢qwb
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
int t;
ll n;
ll f[101],A[101];
void init()
{
A[2]=A[1]=1;
f[1]=f[2]=1;
F(i,3,84)
{
f[i]=f[i-1]+f[i-2];
A[i]=A[i-1]+A[i-2]+f[i-2];
}
}
ll solve(int id,ll num)
{
if(f[id]==num) return A[id];
if(f[id-1]>=num) return solve(id-1,num);
return A[id-1]+num-f[id-1]+solve(id-2,num-f[id-1]);
}
int main()
{
init();
for(scanf("%d",&t);t--;)
{
scanf("%lld",&n);
ll sum=0,ans=0;
int id=0;
while(sum+f[id+1]<n) sum+=f[++id];
F(i,1,id) ans+=A[i];
ans+=solve(id+1,n-sum);
printf("%lld\n",ans);
}
return 0;
}
最新文章
- nodejs事件模块
- 【Android自学日记】搭建Android开发环境
- IntelliJ IDEA 发布最新版本13.0.1
- 银光类似web visio的节点连线控件Essential Diagram免费下载地址
- js完美转换阿拉伯数字为数字大写(原创)
- 我所了解的WEB开发(4) - 神奇的URL
- codeforces 713A A. Sonya and Queries(状态压缩)
- css3实现立方体的旋转功能
- overflow:hiddden与绝对定位的应用场景的事例
- 5、第5节课CSS补充和html 标签讲解20150924
- Sed命令学习
- HDU 5194 DZY Loves Balls
- WebSocket和Socket
- tensorflow会话控制-【老鱼学tensorflow】
- html+css常用小笔记(持续更新)
- RNN入门(4)利用LSTM实现整数加法运算
- Nginx缓存服务
- Spring是如何校验XML的
- 03:open-falcon报警定制
- Resttemplate中设置超时时长方法