「杂题乱刷2」AT_arc122_c

题目链接

AT_arc122_c [ARC122C] Calculator

解题思路

hint1:

考虑构建斐波那契数列来解决问题。

hint2:

二进制。

hint3:

考虑如何解除后效性。

sol:

首先我们考虑如何构建斐波那契数列。

进行 1,2 操作中的一个,然后交替进行 3,4 操作即可。

一个数字能变成斐波那契的第 \(n\) 列,可以在对应二进制位上构建 \(1\)

那么我们只需要从大往小枚举需要斐波那契数列中的哪些数字,然后直接构建二进制数列即可,具体构建方式可以查看代码。

参考代码

ll n;
ll a[110];
bool vis[110];
void _clear(){}
void solve()
{
    _clear();
    cin>>n;
    a[1]=1;
    forl(i,2,86)
        a[i]=a[i-1]+a[i-2];
    forr(i,86,1)
        if(n>=a[i])
            n-=a[i],
            vis[i]=1;
    vector<ll>ans;
    if(vis[86])
        ans.pb(2);
    forl(i,1,43)
    {
        ans.pb(4);
        ans.pb(3);
        if(vis[87-i*2])
            ans.pb(1);
        if(vis[86-i*2])
            ans.pb(2);
    }
    cout<<ans.size()<<endl;
    for(auto i:ans)
        cout<<i<<endl;
}
posted @ 2025-04-09 15:15  wangmarui  阅读(12)  评论(0)    收藏  举报