题解 | #Checkpoints#

Checkpoints

https://ac.nowcoder.com/acm/contest/32282/F

【Checkpoints】

定义E(i)\mathbb{E}(i)为从第ii关开始到通关,所需要通过的关卡的期望。

假设从第 ll 关开始到第 rr 关只有第 ll 关有存档点,那么:

E(l)=12(E(l)+E(l+1))+1E(l+1)=12(E(l)+E(l+2))+1E(r1)=12(E(l)+E(r))+1\begin{matrix} \mathbb{E}(l)&=&\frac{1}{2}(\mathbb{E}(l) +\mathbb{E}(l+1)) + 1\\ \\ \mathbb{E}(l+1)&=&\frac{1}{2}(\mathbb{E}(l) +\mathbb{E}(l+2)) + 1\\ \\ &\cdots & \\ \\ \mathbb{E}(r-1)&=&\frac{1}{2}(\mathbb{E}(l) +\mathbb{E}(r)) + 1\\ \\ \end{matrix}
E(l)=12E(l)+12[34E(l)+14E(l+3)+32]+1=78E(l)+18E(l+3)+74E(l+1)=12E(l)+12[12(E(l)+E(l+3))+1]+1=34E(l)+14E(l+3)+32E(l+2)=12(E(l)+E(l+3))+1\begin{matrix} \mathbb{E}(l)&=&\frac{1}{2}\mathbb{E}(l) +\frac{1}{2}[\frac{3}{4}\mathbb{E}(l) +\frac{1}{4}\mathbb{E}(l+3) + \frac{3}{2}] + 1 &=&\frac{7}{8}\mathbb{E}(l)+\frac{1}{8}\mathbb{E}(l+3)+\frac{7}{4} \\ \\ \mathbb{E}(l+1)&=&\frac{1}{2}\mathbb{E}(l) +\frac{1}{2}[\frac{1}{2}(\mathbb{E}(l) +\mathbb{E}(l+3)) + 1] + 1 &=& \frac{3}{4}\mathbb{E}(l) +\frac{1}{4}\mathbb{E}(l+3) + \frac{3}{2} \\ \\ \mathbb{E}(l+2)&=&\frac{1}{2}(\mathbb{E}(l) +\mathbb{E}(l+3)) + 1\\ \\ &\cdots & \\ \\ \end{matrix}

由数学归纳法可得(令L=rl1L=r-l\ge1):

E(l)=2L12LE(l)+12LE(r)+2L12L1=E(r)+2L+12\begin{matrix} \mathbb{E}(l)&=&\frac{2^L-1}{2^L}\mathbb{E}(l)+\frac{1}{2^L}\mathbb{E}(r)+\frac{2^L-1}{2^{L-1}} \\ \\ &=&\mathbb{E}(r)+2^{L+1}-2 \\ \\ \end{matrix}

因为E(n+1)=0\mathbb{E}(n+1)=0(通关),且任意项的2L+122^{L+1}-2L1L\ge 1)相加均为偶数,所以E(1)\mathbb{E}(1)为偶数,即当kk为奇数时,一定构造不出来。

又因(2L+12)+(21+12)=2L+1(2^{L+1}-2)+(2^{1+1}-2)=2^{L+1}L1L\ge 1),多个2L+12^{L+1}L1L\ge 1)的累加可以表示任意偶数,故偶数一定可以构造出来。(L=1, 21+12=2L=1,\ 2^{1+1}-2=2

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll k, T;
vector<int> res;
void solve() {
    res.push_back(1);
    if((1LL << 1) & k) res.push_back(1);
    for(int i = 2; i <= 60; i++) {
        if((1LL << i) & k) {
            for(int j = 1; j <= i - 2; j++) 
                res.push_back(0);
            res.push_back(1);
            res.push_back(1);
        }
    }
    
}

int main() {
    cin >> T;
    while(T--) {
        cin >> k;
        if(k & 1) {
            cout << -1 << "\n";
            continue;
        }
        res.clear();
        solve();
        cout << res.size() - 1 << "\n";
        for(int i = 0; i < res.size() - 1; i++) 
            cout << res[i] << " \n"[i == res.size() - 2];
    }
    return 0;
}
全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
我也曾抱有希望:说的好直白
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务