第k个互质数

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

输入
输入m ,k (1<=m<=1000000;1<=k<=100000000)
输出
输出第k个数。
样例输入
10 1
10 2
10 3
样例输出
1
3
7

首先,根据欧几里得可知,gcd(b * t + a, b) = gcd(a, b)(t为任意整数),则如果a与b互质,则b * t + a与b也一定互质,如果a与b不互质,则b*t+a与b也一定不互质,所以与m互质的数对m取模具有周期性。可以先求出1~m之间有多少个数与m互质,然后根据周期性去求第k个与m互质的数。

#include <cstdio>const int N = 1000005;
int a[N];int gcd(int a, int b) {while(b) {int r = a % b;a = b;b = r;}return a;
}int main() {int m, k;while(~scanf("%d%d", &m, &k)) {if(m == 1) {printf("%d\n", k);continue;}int num = 0;for(int i = 1; i < m; i++)if(gcd(m, i) == 1)a[num++] = i;int p = k / num;if(k % num == 0) p--;k %= num;if(k == 0) k = num;printf("%d\n", p * m + a[k-1]);}return 0;
}

用上面的方法可以在POJ上AC,可惜的是,在NYOJ上TLE了。所以要寻找一个更快的解决方案,也就是下面的二分+容斥。

首先对m进行质因数分解,求出m有哪些质因数,然后用容斥求[1, mid]内与m互质的数有多少个。

判断的时候,[1,mid]之间与m互质的数的数量 = mid - (包含一个质因子的数的个数)+ (包含2个质因子的书的个数)-(包含3个质因子的数的个数)+ (包含4个质因数的数的个数)……

#include <cstdio>
// 对n进行素因子分解, fac[0]记录因子个数;
int fac[20];
void Div(int n) {int k = 0;for(int i = 2; i * i <= n; ++i){if(n % i == 0) fac[++k] = i;while(n % i == 0) n /= i;}if(n > 1) fac[++k] = n;fac[0] = k;
}
// 计算[1, n]内与m互质的数的个数
int que[1<<10];
int Count(int n, int m) {int g = 0, sum = n;que[++g] = 1;for(int i = 1; i <= fac[0]; ++i){int t = g;for(int j = 1; j <= g; ++j){que[++t] = que[j] * fac[i] * -1;sum += n / que[t];}g = t;}return sum;
}
// 二分,二分枚举一个答案mid,计算[1, mid]内有多少个数与m互质,让答案与K比较;
int Binary_search(int m, int K){int l = 1, r = 2000000000, mid;while(l <= r){mid = (l + r) >> 1;if(Count(mid, m) >= K) r = mid - 1;else l = mid + 1;}return l;
}
int main()
{int m, K;while(scanf("%d%d", &m, &K) != EOF){Div(m);int ans = Binary_search(m, K);printf("%d\n", ans);}return 0;
}

NYOJ 762 第k个互质数(二分 + 容斥)相关推荐

  1. nyoj 762:第k个互质数

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=762 直接给代码好了,容斥原理具体看<组合数学> #include<bi ...

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

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

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

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

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

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

  5. 【COCI11-12 #4】纠结的数【枚举+二分+容斥】

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

  6. 欧拉函数的一道练习题(附加容斥做法)

    jzd同学今天告诉了我们一道关于欧拉函数的题,一开始觉得毫无头绪,当身旁的erge同学切完开始装(xiao)逼(zhang)的时候,他无意间透露的欧拉函数四个字启发了我,最近做了一道很相似的题HDU1 ...

  7. min-max 容斥

    $\min - \max$ 容斥 Part 1 对于简单的$\min - \max$容斥有一般形式,表达为:$\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1 ...

  8. 最简真分数c语言,HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)...

    描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...

  9. Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)

    G. List Of Integers time limit per test 5 seconds memory limit per test 256 megabytes input standard ...

最新文章

  1. hdu-1003 or 最大子序列和(四种解题方法)
  2. centos中rabbitmq的安装及php支持
  3. 以太坊源码分析-交易
  4. 学长的求职经验 记录【就业创业信息网、求职流程、求职小细节】
  5. Javascript的setTimeOut()和setInterval()的定时器用法
  6. PHP聚微商货源网源码
  7. 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园
  8. iOS 数据解析之使用TFHpple解析html
  9. 百度 mysql的sql优化_SQL优化问题
  10. 犹如“狼来了”!折叠屏手机Galaxy Fold可能下月上市
  11. 【Express】—Express路由请求
  12. Halcon 找圆测量工具
  13. 使用CefSharp在.NET中嵌入Google kernel
  14. vmware vSAN 入门
  15. itext html 转换pdf后 字体加粗,HTML转PDF字体的坑搞了半天
  16. Reno与RACK对丢失/重传报文的标记
  17. 品牌如何赋能加盟商,攻克时艰
  18. 设计测试用例之 一个系统,多个摄像头,抓拍车牌,识别车牌,上传网上,网上展示
  19. 在Redmond见到我的偶像Anders
  20. 推荐算法(3):利用用户标签数据

热门文章

  1. 亲身验证切实可行的python项目部署方案
  2. 微信中H5同层Video播放器接入教程
  3. 二维数组的查找,刷题成功——剑指Offer
  4. docker命令的组合使用
  5. SQL SERVER 数据库邮件配置
  6. jquery获取data-*返回undefined小记
  7. [程序员面试题精选100题]19.反转链表
  8. Windows phone 8 学习笔记(7) 设备(转)
  9. 如何书写高质量的jQuery代码
  10. 2021_Nov_9_Supervision_STEMM_What_You_Need_In_Advance?