「杂题乱刷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;
}

浙公网安备 33010602011771号