M. 渚千夏的串

原题链接

题解

1.每一个1对答案的贡献为其前面0的个数
2.不难想到二进制,即每遇到 2k 就考虑要不要放一个1
3.但是这样长度会超标,所以我们将较大的 2k 表示成 2k12k2,其中 k1+k2==k,即在 0 的个数为 2k1 时后面放 2k2 个 1 ,而不是等达到了 2k 个 0 后,再放一个 1
这样一来 2k1+2k2<2k

code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll inf=1e5;
vector<int> q,ans;
int main()
{
    ll sum;
    cin>>sum;
    while(sum)
    {
        q.push_back(sum%2);
        sum/=2;
    }


    ll len=q.size();
    for(int i=0;i<len/2;i++)
    {
        for(int j=1;j<=(1LL<<(max(0LL,(i-1LL))));j++) ans.push_back(0);
        if(q[i]) ans.push_back(1);
    }

    ll now=0;
    for(int i=len-1;i>=len/2;i--) now=now*2+q[i];

    for(int i=1;i<=(1LL<<max(0LL,(len/2-1LL)));i++) ans.push_back(0);
    for(int i=1;i<=now;i++) ans.push_back(1);
    cout<<ans.size()<<endl;
    for(auto it:ans) cout<<it;
    return 0;
}

posted @   纯粹的  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示