题解:CF1453D Checkpoints

提供一种直接基于期望推表达式的做法。

ppp 表示走一步成功的概率,E[x]E[x]E[x] 表示从一个存档点开始,还剩 xxx 步的距离到达下一个存档点,所需的期望步数。若一次成功,共走 xxx 步,概率为 pxp^xpx;若走到第 iii 步时失败,概率为 pi−1(1−p)p^{i-1}(1-p)pi1(1p),之后需要重新开始,共走 E[x]E[x]E[x] 步。因此有表达式:

E[x]=x×px+∑i=1xpi−1(1−p)(i+E[x]) E[x] = x \times p^x + \sum \limits_{i = 1}^x p^{i - 1}(1-p)(i + E[x]) E[x]=x×px+i=1xpi1(1p)(i+E[x])

直接将 p=12p = \frac{1}{2}p=21 带入可知:

E[x]=x(12)x+2[1−(x+2)(12)x+1]+[1−(12)x]E[x](12)xE[x]=2−(12)x−1E[x]=2x+1−2 E[x] = x (\frac{1}{2})^x + 2[1 - (x + 2)(\frac{1}{2})^{x + 1}] + [1 - (\frac{1}{2})^x]E[x]\\ (\frac{1}{2})^xE[x] = 2 - (\frac{1}{2})^{x - 1}\\ E[x] = 2^{x + 1} - 2 E[x]=x(21)x+2[1(x+2)(21)x+1]+[1(21)x]E[x](21)xE[x]=2(21)x1E[x]=2x+12

因此直接构造 100...\texttt{100...}100... 的形式,类似二进制拆分进行构造即可。由于 E[x]E[x]E[x] 为偶数,所以奇数的情况显然无解。

代码如下:

#include <bits/stdc++.h>
#define pii pair <int,int>
#define init(x) memset (x,0,sizeof (x))
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
using namespace std;
const int MAX = 1e5 + 5;
const int MOD = 1e9 + 7;
inline ll read ();
void solve ()
{
    ll x = read ();
    if (x & 1) {puts ("-1");return;}
    vector <ll> f (61,0);
    for (int i = 0;i <= 60;++i) f[i] = (1ll << (i + 2)) - 2;
    vector <int> ans;
    for (int i = 60;~i;--i)
    {
        while (x >= f[i])
        {
            x -= f[i];
            ans.push_back (1);
            for (int j = 1;j <= i;++j) ans.push_back (0);
        }
    }
    assert ((int)ans.size () <= 5000);
    printf ("%d\n",(int) ans.size ());
    for (auto v : ans) printf ("%d ",v);
    puts ("");
}
int main ()
{
    int t = read ();
    while (t--) solve ();
    return 0;
}
inline ll read ()
{
    ll s = 0;int f = 1;
    char ch = getchar ();
    while ((ch < '0' || ch > '9') && ch != EOF)
    {
        if (ch == '-') f = -1;
        ch = getchar ();
    }
    while (ch >= '0' && ch <= '9')
    {
        s = s * 10 + ch - '0';
        ch = getchar ();
    }
    return s * f;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值