代码求调
查看原帖
代码求调
374433
ppip嘟嘟嘟楼主2022/4/10 21:34
#include <bits/stdc++.h>
using namespace std;
const int MAXN{1<<18};
int n,k;
int cnt(int x)
{
    x&=-x;
    if (!(x>>n-k+1)) return ((1<<k)-1)*x;
    else return (x>>n-k)-1|(((1<<k)-1)*x&(1<<n)-1);
}
int main()
{
    cin>>n>>k;
    if (!(k&1)||n!=1&&n==k)
    {
        cout<<"0"<<endl;
        return 0;
    }
    cout<<"1\n0"<<endl;
    for (int i{1},c{0};i<(1<<n);++i)
        printf("%d ",c^=cnt(i));
    return 0;
}

算法解释:在 n=4,k=3n=4,k=3 时的异或(即变化)值:

iicnt(i)\text{cnt}(i)ansians_i
0-0000
101110111
211101001
301111110
311010011
\dots\dots\dots

类似于根据每次 ii 的 lowbit 循环左移

不知道算法对不对

2022/4/10 21:34
加载中...