Divisibility

我们考虑删数字

首先我们可以发现有一类数很特殊就是大于 n / 2的素数, 因为这些素数的贡献只有1, 并且在n大的时候,

这些素数的个数不是很少, 我们可以最后用这些数去调整, 并且删掉一个数的时候删掉的是它的因子个数,

所以可以用素数去控制最后的数量。当n小的时候直接状压枚举。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 1e6 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); int n;
LL k;
int rel[N];
bool vis[N];
int now;
vector<int> vc;
set<int> Set;
vector<int> fac[N]; int main() {
scanf("%d%lld", &n, &k);
if(n <= ) {
vector<int> ret;
for(int S = ; S < ( << n); S++) {
ret.clear();
for(int i = ; i < n; i++)
if(S >> i & ) ret.push_back(i + );
int cnt = ;
for(int i = ; i < SZ(ret); i++) {
for(int j = i + ; j < SZ(ret); j++) {
if(ret[j] % ret[i] == ) {
cnt++;
}
}
}
if(cnt == k) {
puts("Yes");
printf("%d\n", SZ(ret));
for(auto& t : ret) printf("%d ", t);
puts("");
return ;
}
}
puts("No");
} else {
for(int i = ; i <= n; i++) {
for(int j = i + i; j <= n; j += i)
vis[j] = true;
}
for(int i = ; i <= n; i++) Set.insert(i);
for(int i = ; i <= n; i++) {
for(int j = i + i; j <= n; j += i) {
now++;
rel[j]++;
rel[i]++;
fac[j].push_back(i);
}
}
if(now < k) {
puts("No");
return ;
}
if(now == k) {
puts("Yes");
printf("%d\n", SZ(Set));
for(auto& t : Set) printf("%d ", t);
puts("");
return ;
}
for(int i = n / + ; i <= n; i++) {
if(!vis[i]) {
vc.push_back(i), now--, Set.erase(i);
rel[]--;
if(now == k) {
puts("Yes");
printf("%d\n", SZ(Set));
for(auto& t : Set) printf("%d ", t);
puts("");
return ;
}
}
}
while(now > k) {
int v = *Set.rbegin();
if(rel[v] <= now - k) {
now -= rel[v];
Set.erase(v);
for(auto& t : fac[v]) rel[t]--;
} else {
int who = v;
for(auto& t : Set)
if(now - rel[t] <= k && rel[t] < rel[who]) who = t;
now -= rel[who];
Set.erase(who);
for(auto& t : fac[who]) rel[t]--;
while(now < k && SZ(vc)) {
now++;
Set.insert(vc.back());
vc.pop_back();
}
}
}
if(now == k) {
puts("Yes");
printf("%d\n", SZ(Set));
for(auto& t : Set) printf("%d ", t);
puts("");
return ;
} else {
puts("No");
}
}
return ;
} /*
*/

Codeforces 922F Divisibility 构造的更多相关文章

  1. Codeforces 922F Divisibility (构造 + 数论)

    题目链接  Divisibility 题意 给定$n$和$k$,构造一个集合$\left\{1, 2, 3, ..., n \right\}$的子集,使得在这个集合中恰好有$k$对正整数$(x, y) ...

  2. codeforces 1041 e 构造

    Codeforces 1041 E 构造题. 给出一种操作,对于一棵树,去掉它的一条边.那么这颗树被分成两个部分,两个部分的分别的最大值就是这次操作的答案. 现在给出一棵树所有操作的结果,问能不能构造 ...

  3. Codeforces 550C —— Divisibility by Eight——————【枚举 || dp】

     Divisibility by Eight time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  4. Codeforces - 474D - Flowers - 构造 - 简单dp

    https://codeforces.com/problemset/problem/474/D 这道题挺好的,思路是这样. 我们要找一个01串,其中0的段要被划分为若干个连续k的0. 我们设想一个长度 ...

  5. [math] Codeforces 597A Divisibility

    题目:http://codeforces.com/problemset/problem/597/A Divisibility time limit per test 1 second memory l ...

  6. Codeforces Global Round 8 B. Codeforces Subsequences(构造)

    题目链接:https://codeforces.com/contest/1368/problem/B 题意 构造最短的至少含有 $k$ 个 $codeforces$ 子序列的字符串. 题解 如下表: ...

  7. Codeforces 410C.Team[构造]

    C. Team time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  8. Codeforces 716C[数论][构造]

    /* CF傻逼构造题 某人要经过n回合游戏,初始分值是2,等级为1. 每次有两种操作 1.无条件,分值加上自己的等级数. 2.当目前的数字是完全平方数并且该数字开方以后是等级数加1的整数倍,那么可以将 ...

  9. codeforces 630J Divisibility

    J. Divisibility time limit per test 0.5 seconds memory limit per test 64 megabytes input standard in ...

随机推荐

  1. 天宝MB-Two:无法打开web登陆界面

    在浏览器中访问http://192.168.1.100,正常是打开MB-Two芯片的web 登陆界面,但是事与愿违,打开的是帮助界面. 解决办法: 用串口调试助手,波特率默认是115200,连接过去. ...

  2. linux /proc目录

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  3. jmeter4.0的汉化

    一,刚刚安装好,我们看到的是这个界面: 二,option-——>choose language -——>Chinese simplified,然后就可以啦!

  4. requests 的基本用法

    r = requests.get('www.baidu.com') r.request.headers{'User-Agent': 'python-requests/2.18.4', 'Accept- ...

  5. 【python】json中字典key不可为数值型

    遇到了一个很诡异的错误.写一个字典,存入json文件.之后读出判断是否存在key.结果惊奇的发现,同一个key居然存在两次. 原因:json会将数值key转换为unicode 结论:使用json时字典 ...

  6. java概念基础笔记整理

    1.构造方法没有类型,有类型的不是不叫构造方法. 2.一个类的的成员变量可以是java允许的任何数据类型,一个类可以把某个对象作为自己的一个成员变量,如果用这样的类创建对象,那么该对象中就会其他对象, ...

  7. CSS----布局不理解

    正常情况 正常显示 如果往div标签中添加汉字 出现显示(不理解) 解决方式 加上vertical-align:top

  8. Python属性(@property)

    创建用于计算机的属性 在Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性.将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号&q ...

  9. sass方式实现颜色平铺(红色--->紫色)

    <!DOCTYPE html><html lang="en"><head> <link rel="stylesheet" ...

  10. Appium Desired Capabilities

    Appium Desired Capabilities Desired Capabilities 是由 keys 和 values 组成的 JSON 对象. 举个简单例子: { "platf ...