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 ...
随机推荐
- how to avoid inheritance abuse
Liskov Principle: if S is a subtype of Type T, then any objects of type T may be repalced by objects ...
- 并发性能的隐形杀手之伪共享(false sharing)
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- centos6.5 python命令行模式左右建无法使用
我的虚拟机是centos6.5,自带python2.6:安装了Python2.7(安装了pip管理工具)后,在python2.7命令行模式下,左右键及退格键无法使用,基于以上情况,我进行了百度: 第一 ...
- 分析Vue框架源码心得
1.在封装一个公用组件,比如button按钮,我们多个地方使用,不同类型的button调用不同的方法,我们就可以这样用 代码片段: <lin-button v-for="(item,i ...
- 随机生成n位随机数(包含大写字母、小写字母、数字)
package com.java.weiju; import java.security.SecureRandom; import java.util.Date; import java.util.R ...
- Confluence 6 启用主题评论
页面或者博客页面中显示的评论以下面 2 种方式显示: 主题模式(Threaded):以继承回复的方式显示页面的评论.每一回复的评论将会在不同评论之间显示,以表示各个评论之间的关系. 平面模式(Flat ...
- Confluence 6 SQL Server 测试你的数据库连接
在你的数据库设置界面,有一个 测试连接(Test connection)按钮可以检查: Confluence 可以连接你的数据库服务器 数据库字符集和隔离级别是正确的 你的数据库用户有正确的数据库权限 ...
- Confluence 6 布局高级自定义
重载 Velocity 模板 velocity 目录是 Confluence Velocity 模板文件进行搜索时候需要的文件夹.例如,你可以通过将你的 Velocity 文件使用正确的文件名放置到正 ...
- 高性能JavaScript读后感
这本书让lz对js性能优化有了更深刻的理解,现在因为我们通常用第三方构建工具webpack.gulp等诸如此类,之前总是听说什么dom操作影响性能呢,对这个概念总是有点模糊,但看完这本书之后后,相对而 ...
- gnuradio 创建cos_source
C++教程 ys_linux@computer:~$ gr_modtool nm kcd Creating out-of-tree module in ./gr-kcd... Done. Use 'g ...