NYOJ 762 第k个互质数(二分 + 容斥)
第k个互质数
- 描述
-
两个数的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个互质数(二分 + 容斥)相关推荐
- nyoj 762:第k个互质数
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=762 直接给代码好了,容斥原理具体看<组合数学> #include<bi ...
- D. Inconvenient Pairs(二分容斥)
D. Inconvenient Pairs(二分&容斥) 因为每个点(x,y)(x,y)(x,y)要么xxx在直线上要么yyy在直线上. 显然xxx在直线上的点与yyy在直线上的点不会产生贡献 ...
- codeforces B. Friends and Presents(二分+容斥)
题意:从1....v这些数中找到c1个数不能被x整除,c2个数不能被y整除! 并且这c1个数和这c2个数没有相同的!给定c1, c2, x, y, 求最小的v的值! 思路: 二分+容斥,二分找到v的值 ...
- POJ-2773 欧几里得 + 二分 + 容斥
题意: 求与n互质的第k个数 开始看到这题很蒙 试了好几种做法都T了 后来才知道 由于GCD(a,b) = GCD(b, a%b) = GCD(a%b,b) 所以 GCD(a,b) = GCD(a+ ...
- 【COCI11-12 #4】纠结的数【枚举+二分+容斥】
题目描述: 找出第N小的正整数X,满足条件X的最小的素因子是P.如果X的值超过10^9,则输出0. 输入格式:第1行:2个整数N和P (1 ≤ N, P ≤ 10^9),P一定是素数 题目分析: 如果 ...
- 欧拉函数的一道练习题(附加容斥做法)
jzd同学今天告诉了我们一道关于欧拉函数的题,一开始觉得毫无头绪,当身旁的erge同学切完开始装(xiao)逼(zhang)的时候,他无意间透露的欧拉函数四个字启发了我,最近做了一道很相似的题HDU1 ...
- min-max 容斥
$\min - \max$ 容斥 Part 1 对于简单的$\min - \max$容斥有一般形式,表达为:$\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1 ...
- 最简真分数c语言,HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)...
描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...
- 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 ...
最新文章
- hdu-1003 or 最大子序列和(四种解题方法)
- centos中rabbitmq的安装及php支持
- 以太坊源码分析-交易
- 学长的求职经验 记录【就业创业信息网、求职流程、求职小细节】
- Javascript的setTimeOut()和setInterval()的定时器用法
- PHP聚微商货源网源码
- 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园
- iOS 数据解析之使用TFHpple解析html
- 百度 mysql的sql优化_SQL优化问题
- 犹如“狼来了”!折叠屏手机Galaxy Fold可能下月上市
- 【Express】—Express路由请求
- Halcon 找圆测量工具
- 使用CefSharp在.NET中嵌入Google kernel
- vmware vSAN 入门
- itext html 转换pdf后 字体加粗,HTML转PDF字体的坑搞了半天
- Reno与RACK对丢失/重传报文的标记
- 品牌如何赋能加盟商,攻克时艰
- 设计测试用例之 一个系统,多个摄像头,抓拍车牌,识别车牌,上传网上,网上展示
- 在Redmond见到我的偶像Anders
- 推荐算法(3):利用用户标签数据
热门文章
- 亲身验证切实可行的python项目部署方案
- 微信中H5同层Video播放器接入教程
- 二维数组的查找,刷题成功——剑指Offer
- docker命令的组合使用
- SQL SERVER 数据库邮件配置
- jquery获取data-*返回undefined小记
- [程序员面试题精选100题]19.反转链表
- Windows phone 8 学习笔记(7) 设备(转)
- 如何书写高质量的jQuery代码
- 2021_Nov_9_Supervision_STEMM_What_You_Need_In_Advance?