题意

题目给出n,k,要求找出一个1到n的子集,(a,b)的对数等于k;(a,b)满足a<b且b%a==0;

分析

还记不记得求素数的时候的欧拉筛!对就那样!如果把每个数字看作一个点的话,可以通过欧拉筛的方法求入度,然后想一想筛的时候j是如何增加的,可以n/i-1直接求出出度。知道这个结论这个题就不难了。先找到一个范围中,他的边数大于等于k,然后在这个范围内尝试删掉结点是否符合要求。(注意当i>n/2时,在n的范围内就没有出度了,所以可以确定,当在某个范围内边数大于等于k,一点可以通过删除某些结点使边数刚好达到k)。题解的最后那一部分我没有看懂(英语渣智商渣),但是通过这种方法确实可以在cf上A掉这个题;

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=+;
int d[maxn];
int n;
long long k;
int main(){
cin>>n>>k;
long long sum=;
for(int i=;i<=n;i++){
for(int j=*i;j<=n;j+=i){
d[j]++;
sum++;
}
}
if(sum<k){
printf("No");
return ;
}
else
printf("Yes\n");
long long ps=;
for(int i=;i<=n;i++){
ps+=d[i];
if(ps>=k){
n=i;
break;
}
}
vector<int>ans;
for(int i=;i<=n;i++){
int degree=d[i]+(n/i)-;
if(ps-degree<k){
ans.push_back(i);
continue;
}
ps-=degree;
for(int j=*i;j<=n;j+=i){
if(d[j])d[j]--;
}
}
printf("%d\n",ans.size());
for(int i=;i<ans.size();i++)
printf("%d ",ans[i]);
return ;
}

最新文章

  1. javase--&gt;基础知识(三)
  2. [转]ConsumeContainerWhitespace property to remove blank space in SSRS 2008 report
  3. tomcat集群配置
  4. Eclipse安装ADT插件
  5. my dup2
  6. linux中常用的命令
  7. iframe ios中h5页面 样式变大
  8. Maven Web Projest经Update Projest报错:Cannot nest &#39;myApp/src/main/resource&#39; inside &#39;myApp/src&#39;. To enable the nesting exclude &#39;main/&#39; from &#39;myApp/src&#39;
  9. iOS开发--知识点总结
  10. UVA 257 Palinwords(hash)题解
  11. PowerDesigner 生成的脚本取掉双引号
  12. hihernate一对多关联映射
  13. Machine Learning——吴恩达机器学习笔记(酷
  14. linux 测试工具
  15. js判断回车,判断焦点控件
  16. 读《the facebook effect》
  17. MySQL event调度
  18. 转:在android中button响应的两种方式
  19. java算法外传之靠工资多久能实现小目标...
  20. 练习五十六:for循环

热门文章

  1. Android内存优化(一)DVM和ART原理初探
  2. 学习nodejs部分基础内容入门小结
  3. Mac安装并破解StarUML
  4. HDU - 6183:Color it (线段树&amp;动态开点||CDQ分治)
  5. linux之epoll
  6. [CSU1911]Card Game
  7. 转载关于Qsys的 指令总线 和 数据总线
  8. ubuntu下访问支付宝官网,安装安全控件
  9. jquery ajax 跨域设置
  10. 常用DNS列表(电信、网通)