Codeforces 922F 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 构造的更多相关文章
- Codeforces 922F Divisibility (构造 + 数论)
题目链接 Divisibility 题意 给定$n$和$k$,构造一个集合$\left\{1, 2, 3, ..., n \right\}$的子集,使得在这个集合中恰好有$k$对正整数$(x, y) ...
- codeforces 1041 e 构造
Codeforces 1041 E 构造题. 给出一种操作,对于一棵树,去掉它的一条边.那么这颗树被分成两个部分,两个部分的分别的最大值就是这次操作的答案. 现在给出一棵树所有操作的结果,问能不能构造 ...
- Codeforces 550C —— Divisibility by Eight——————【枚举 || dp】
Divisibility by Eight time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Codeforces - 474D - Flowers - 构造 - 简单dp
https://codeforces.com/problemset/problem/474/D 这道题挺好的,思路是这样. 我们要找一个01串,其中0的段要被划分为若干个连续k的0. 我们设想一个长度 ...
- [math] Codeforces 597A Divisibility
题目:http://codeforces.com/problemset/problem/597/A Divisibility time limit per test 1 second memory l ...
- Codeforces Global Round 8 B. Codeforces Subsequences(构造)
题目链接:https://codeforces.com/contest/1368/problem/B 题意 构造最短的至少含有 $k$ 个 $codeforces$ 子序列的字符串. 题解 如下表: ...
- Codeforces 410C.Team[构造]
C. Team time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Codeforces 716C[数论][构造]
/* CF傻逼构造题 某人要经过n回合游戏,初始分值是2,等级为1. 每次有两种操作 1.无条件,分值加上自己的等级数. 2.当目前的数字是完全平方数并且该数字开方以后是等级数加1的整数倍,那么可以将 ...
- codeforces 630J Divisibility
J. Divisibility time limit per test 0.5 seconds memory limit per test 64 megabytes input standard in ...
随机推荐
- 我理解的vue生命周期
说些题外话,引出vue的生命周期. 比如人出生到寿终正寝,这是人的一个生命周期.他会经历出生,婴儿时期,童年时期,少年时期,青年,中年,老年,到 end.然后,每个时期都会有一定的历史任务在等着去完成 ...
- ansible笔记(12):handlers的用法
ansible笔记():handlers的用法 这篇文章会介绍playbook中handlers的用法. 在开始介绍之前,我们先来描述一个工作场景: 当我们修改了某些程序的配置文件以后,有可能需要重启 ...
- docker简单入门之使用docker容器部署简单的java web开源项目jpress博客程序
一.在centos7.3上安装docker 前置条件 x86_64-bit 系统 kernel 3.10+ .检查内核版本,返回的值大于3.10即可 [root@node1 ~]# uname -r ...
- mybatis:访问静态变量或方法
访问方法: <if test="@com.csget.constant.ConstantApp@getUser('mobile')== 'kf'"> <![CDA ...
- ubuntu中文版man
man默认是英文的,但ubuntu的源里也有中文版的.以下是配置方法: 1) 终端输入sudo apt-get install manpages-zh 2) 安装后修改配置文件sudo gedit ...
- python字符串str和字节数组bytes相互转化
1 引言 后续待补充 2 代码 b = b"Hello, world!" # bytes s = "Hello, world!" # string print( ...
- IOS 将状态栏改为白色
1.将 View controller-based status bar appearance 删除(默认为 YES),或设置为YES 2.设置rootViewcontroller,如果为viewC ...
- web页面乱码,JSP页面编码设置
解决Web页面访问出现乱码bug,JSP页面首行添加: <%@ page language="java" contentType="text/html; chars ...
- deepin、Ubuntu安装Nginx
deepin安装nginx 切换至root用户 su 密码: 基础库的安装 安装gcc g++的依赖库 sudo apt-get install build-essential && ...
- Netty简单聊天室
1.创建maven项目,在pom.xml中引入netty的jar包 <project xmlns="http://maven.apache.org/POM/4.0.0" xm ...