首页 > 其他分享 >[ARC138D] Differ by K bits 题解

[ARC138D] Differ by K bits 题解

时间:2023-04-21 20:04:51浏览次数:42  
标签:Differ le cout int 题解 ARC138D

小清新构造题。

首先 \(K=1\) 的情况是 trival 的,直接格雷码即可。

对于 \(K>1\),我们发现题目的约束相当于 \(\operatorname{popcount}(P_i\oplus P_{(i+1)\bmod 2^N})=K\),考虑 \(P_i\) 的差分序列 \(D_i\),那么 \(D_i\) 一定是一个恰好有 \(K\) 位 \(1\) 的二进制数,记 \(S=\{i\mid 0\le i\le 2^N-1\land \operatorname{popcount}(i)=K\}\),则 \(D_i\in S\)。

题目要求 \(P_i\) 不能重复,所以我们得到的 \(\bigoplus\limits_{j=0}^i D_j\) 必须不重,因此考虑先用线性基处理掉 \(S\) 中能被别的数表示出来的数,那么剩下的数可以保证:只要选数的方案不同,结果就不同。

于是我们只需要让每次选数方案的变化量为 \(1\) 即可,直接格雷码即可。

#include <iostream>
#include <vector>

using namespace std;

const int kN = 18;

int n, k, p[kN];
vector<int> l;

void A(int v) {
  int _v = v;
  for (int i = n - 1; i >= 0; --i) {
    if (v >> i & 1) {
      if (p[i]) {
        v ^= p[i];
      } else {
        p[i] = v, l.push_back(_v);
        break;
      }
    }
  }
}

int main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  cin >> n >> k;
  for (int i = 0; i < (1 << n); ++i) {
    int c = 0;
    for (int j = 0; j < n; ++j) {
      c += i >> j & 1;
    }
    if (c == k) {
      A(i);
    }
  }
  if (l.size() < n) {
    cout << "No";
    return 0;
  }
  cout << "Yes\n";
  for (int i = 0; i < (1 << n); ++i) {
    int p = i ^ (i >> 1), v = 0;
    for (int j = 0; j < n; ++j) {
      if (p >> j & 1) {
        v ^= l[j];
      }
    }
    cout << v << ' ';
  }
  return 0;
}

标签:Differ,le,cout,int,题解,ARC138D
From: https://www.cnblogs.com/bykem/p/17341588.html

相关文章

  • 团体程序设计天梯赛 L1-064 估值一亿的AI核心代码 题解
    思路L1-064估值一亿的AI核心代码题意有一点不太清晰的,就是原文中的'I',无论是否是单独的,都不能变为小写。如果是单独的'I'再被转化为'you'。这种模拟题就需要每个的分分清清楚楚的,不要都揉到一块儿,容易写错。具体还有些需要注意的在代码里注释着了。代码#include<iostream>......
  • Android Studio Gradle Download 慢/卡问题解决
    build.gradlebuildscript{repositories{//jcenter()//jcenter(){url'http://jcenter.bintray.com/'}maven{url'http://maven.aliyun.com/nexus/content/groups/public/'}maven{url"https://jitpac......
  • 【题解】P4069 [SDOI2016]游戏
    题目描述Alice和Bob在玩一个游戏。游戏在一棵有\(n\)个点的树上进行。最初,每个点上都只有一个数字,那个数字是\(123456789123456789\)。有时,Alice会选择一条从\(s\)到\(t\)的路径,在这条路径上的每一个点上都添加一个数字。对于路径上的一个点\(r\),若\(r\)与\(s\)......
  • 【题解】P5327 [ZJOI2019] 语言
    P5327[ZJOI2019]语言题目描述九条可怜是一个喜欢规律的女孩子。按照规律,第二题应该是一道和数据结构有关的题。在一个遥远的国度,有\(n\)个城市。城市之间有\(n-1\)条双向道路,这些道路保证了任何两个城市之间都能直接或者间接地到达。在上古时代,这\(n\)个城市之间处......
  • Android问题解决:android.os.FileUriExposedException: file:///storage/......Intent.
    文章目录一、遇到问题二、解决问题三、分析问题一、遇到问题---------beginningofcrash2022-12-2720:18:15.01014422-14422/com.lisi.evidence_boxE/AndroidRuntime:FATALEXCEPTION:mainProcess:com.lisi.evidence_box,PID:14422android.os.FileUriExpose......
  • 2022年中国大学生程序设计竞赛女生专场-比赛题解
    比赛链接:Dashboard-2022年中国大学生程序设计竞赛女生专场-CodeforcesA.减肥计划(模拟)模拟,如果队列第一个人体重是最大的了,则这个人的位置不会再变,直接输出即可。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_......
  • CF1797E 线段树 + 倍增 题解
    Preface有趣的一道ds,赛后不看题解做出来了。Solution首先有一个性质:\(\varphi(x)\)经过\(\mathcal{O}(\logx)\)次迭代后变为\(1\)。证明:若\(x\)为奇数,\(\varphi(x)=x\sum_{i=1}^{k}\frac{p_i-1}{p_i}\),\(p_i\)为奇数,所以\(p_i-1\)为偶数,我们就能得到\(\varphi(x)......
  • LeetCode-Go:一个使用 Go 语言题解 LeetCode 的开源项目
    在中国的IT环境里,大多数场景下,学习算法的目的在于通过笔试算法题。但算法书林林总总,有时候乱花渐欲迷人眼。杜甫有诗云:读书破万卷,下笔如有神。不管选择哪本书,只要深入学习,分层次,逐层进阶,一定可以将算法攻克。笔者强烈推荐一个Github开源项目LeetCode-Go,你不仅可以把他当做......
  • 2022上半年系统集成项目案例分析真题解析(广东卷)
    2022上半年系统集成项目案例分析真题解析(广东卷)......
  • Vscode 卡顿、CPU 过高问题解决
    原则:非必要不要搞很多Vscode的插件,Vscode本身插件很强大,但是非必要不要使用很多插件。在VSCode扩展市场目前其实存在着不少下载量特别高但是不应该再被使用的扩展,显然官方是不可能直接给你标出来哪些扩展已经被废弃了,哪些有严重bug,纯靠扩展作者自觉。第一步:Ctrl+Shift+P:D......