题目描述:

找出第N小的正整数X,满足条件X的最小的素因子是P。如果X的值超过10^9,则输出0。
输入格式:第1行:2个整数N和P (1 ≤ N, P ≤ 10^9),P一定是素数

题目分析:

如果n=1,输出p,否则答案最小都是p2p^2p2,如果不为0只能p≤109p\le\sqrt{10^9}p≤109​,于是p的范围大大缩小。

考虑p的所有倍数,去掉能够被2,3,5…整除的之后就是满足条件的X。

当p>50p>50p>50时,可以用小于p的质数暴力标记p的倍数,复杂度为1092p+1093p+1095p...\frac {10^9}{2p}+\frac {10^9}{3p}+\frac {10^9}{5p}...2p109​+3p109​+5p109​...,比109pln⁡\frac {10^9}p\lnp109​ln略小。

当p<=50p<=50p<=50时,由于小于ppp的素数只有20个,所以可以二分一个p的倍数X,然后去掉其中能够被小于p的素数整除的数,这可以容斥解决,复杂度O(220log109)O(2^{20}log10^9)O(220log109)。

Code:

#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
const int inf = 1e9;
int n,p,pr[maxn],cnt,ans;
bool v[maxn],mark[20000005];
void Prime(const int N){for(int i=2;i<=N;i++){if(!v[i]) pr[++cnt]=i;for(int j=1;j<=cnt&&(i*pr[j])<=N;j++){v[i*pr[j]]=1;if(i%pr[j]==0) break;}}
}
int num,Up;
void dfs(int i,int s,int tp){if(pr[i]==p) {num+=tp*Up/s;return;}dfs(i+1,s,tp);if(1ll*s*pr[i]<=Up) dfs(i+1,s*pr[i],-tp);
}
int main()
{scanf("%d%d",&n,&p);if(n==1) return printf("%d\n",p),0;if(1ll*p*p>1e9) return puts("0"),0;Prime(p);if(p>50){int mx=inf/p;for(int i=1;i<cnt;i++)for(int j=pr[i];j<=mx;j+=pr[i])mark[j]=1;for(int i=1,num=0;p*i<=inf;i++){if(!mark[i]) num++;if(num==n) {ans=p*i;break;}}printf("%d\n",ans);}else{int l=2,r=inf/p+1,mid;while(l<r){mid=(l+r)>>1;if(Up=mid,num=0,dfs(1,1,1),num>=n) r=mid;else l=mid+1;}printf("%d\n",p*l<=inf?p*l:0);}
}

【COCI11-12 #4】纠结的数【枚举+二分+容斥】相关推荐

  1. NYOJ 762 第k个互质数(二分 + 容斥)

    第k个互质数 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 两个数的a,b的gcd为1,即a,b互质,现在给你一个数m,你知道与它互质的第k个数是多少吗?与m互质的数按 ...

  2. codeforces B. Friends and Presents(二分+容斥)

    题意:从1....v这些数中找到c1个数不能被x整除,c2个数不能被y整除! 并且这c1个数和这c2个数没有相同的!给定c1, c2, x, y, 求最小的v的值! 思路: 二分+容斥,二分找到v的值 ...

  3. 【BZOJ4833】最小公倍佩尔数(min-max容斥)

    [BZOJ4833]最小公倍佩尔数(min-max容斥) 题面 BZOJ 题解 首先考虑怎么求\(f(n)\),考虑递推这个东西 \((1+\sqrt 2)(e(n-1)+f(n-1)\sqrt 2) ...

  4. D. Inconvenient Pairs(二分容斥)

    D. Inconvenient Pairs(二分&容斥) 因为每个点(x,y)(x,y)(x,y)要么xxx在直线上要么yyy在直线上. 显然xxx在直线上的点与yyy在直线上的点不会产生贡献 ...

  5. POJ-2773 欧几里得 + 二分 + 容斥

    题意: 求与n互质的第k个数 开始看到这题很蒙 试了好几种做法都T了 后来才知道 由于GCD(a,b) =  GCD(b, a%b) = GCD(a%b,b) 所以 GCD(a,b) = GCD(a+ ...

  6. P3172-[CQOI2015]选数【dp,容斥】

    正题 题目链接:https://www.luogu.com.cn/problem/P3172 题目大意 求有多少个长度为NNN的值域在[L,R][L,R][L,R]这个区间的序列满足它们的gcdgcd ...

  7. [CQOI2014]数三角形 组合数 + 容斥 + gcd

    推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...

  8. [BZOJ3930][CQOI2015]选数(数论+容斥)

    首先,进行如下处理: 1.如果 L L是KK的倍数,那么把 L L变为LK\frac{L}{K},否则变为 ⌊LK⌋+1 \lfloor\frac{L}{K}\rfloor+1. 2.把 H H变成⌊ ...

  9. jzoj5498 【清华集训2017模拟12.10】大佬的难题 巧妙容斥

    分治容斥都想了,但想不出正解.. 先说60分的吧 先排序a,然后在b,c上分治. 我们将b两边归并的同时,用数据结构维护b比当前小的c都在哪些地方. 这样就是n log2 n 再说说正解 记a[x] ...

最新文章

  1. pyqt5实战开发主窗口加布局
  2. H3C LMI协议标准
  3. C语言goto语句的使用
  4. Day28:Event对象、队列、multiprocessing模块
  5. CF 2B.The least round way
  6. 将Mac OS X从Snow Leopard升级到Mountain Lion
  7. java代码实现解压文件_Java压缩/解压文件的实现代码
  8. 微信支付—微信H5支付「非微信内部浏览器-QQ/UC浏览器等」
  9. 常年“盘踞”数据库前五的 MongoDB,在中国有哪些新动向?
  10. mysql查询触发器_mysql查看所有触发器以及存储过程等操作集合【转】
  11. python基础--字典
  12. git rebase之前需要 commit 才行
  13. Thinkphp 6.0商城系统,B2C商城系统全新UI
  14. 步进电机驱动控制器,电动云台控制。
  15. Pycharm CPU占用100%
  16. 【饭谈】为什么有的技术博文你看不懂?
  17. Mac 下如何解压 bin 文件
  18. 论找对客服妹子对修改邓白氏码的公司信息的重要性
  19. idea git操作
  20. python元组的定义方式_python基础之元组(Tuple)、字典(Dictionary)详解

热门文章

  1. Word处理控件Aspose.Words功能演示:在 Java 中将 HTML 文件转换为 Word 文档
  2. NLP(二)(问答系统搭建(2)分词)
  3. IDEA代码颜色字体风格设置
  4. easyExcel追加数据写入模板
  5. 佳能lbp611cn硒鼓_佳能LBP611cn驱动
  6. 【C语言】调试方法和技巧详解
  7. linux 批量解压gz文件夹,linux 批量解压gz bz2文件
  8. bzoj 1503 郁闷的出纳员 (平衡树+前缀和)
  9. 别再翻了,面试二叉树看这 11 个就够了~
  10. (1366, Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...'for column 'VARIABLE_VALUE' at489