poj2773(欧基里德算法 或 二分+容斥)
题目链接:https://vjudge.net/problem/POJ-2773
题意:给定m,k,求与m互质的第k个数。
思路一:利用gcd(a,b)=gcd(b*t+a,b)知道,与m互质的数是以m为周期分布的,这样可以先枚举小于m的所有与m互质的数,利用周期就可以得到第k小的数了,这样复杂度为O(T*m),比较大,但也能过,2439ms,代码实现相对简单。
AC代码:
#include<cstdio>
using namespace std; int gcd(int a,int b){
return b?gcd(b,a%b):a;
} int m,k,a[],cnt; int main(){
while(~scanf("%d%d",&m,&k)){
cnt=;
for(int i=;i<=m;++i)
if(gcd(i,m)==)
a[++cnt]=i;
printf("%d\n",((k-)/cnt)*m+a[(k-)%cnt+]);
}
return ;
}
思路二:一般看到求第k个数可以想到二分思想,我们可以在int范围内二分答案,每次二分到mid时,要得到[1,mid]区间内与m互质的数的个数才行。求与m互质的数的个数,很明显求不互质的数的个数要方便,可以通过容斥转换为计算[1,mid]中与m不互质的数的个数,即通过枚举m的所有约数(预先通过唯一分解定理打表得到m的所有质因数,设有cnt个质因数,然后就有2^cnt-1个约数组合),通过约数中质因数数目的奇偶决定加或减即可,复杂读小很多。0ms通过。
AC代码:
#include<cstdio>
using namespace std;
typedef long long LL; int m,k,cnt,fac[],ans; void init(){
cnt=;
int tmp=m;
for(int i=;i*i<=m;++i)
if(tmp%i==){
fac[cnt++]=i;
while(tmp%i==) tmp/=i;
}
if(tmp!=) fac[cnt++]=tmp;
} int getnum(int x){
int ret=x;
for(int i=;i<(<<cnt);++i){
int t1=,t2=;
for(int j=;j<cnt;++j)
if(i&(<<j))
t1*=fac[j],++t2;
if(t2&) ret-=x/t1;
else ret+=x/t1;
}
return ret;
} int main(){
while(~scanf("%d%d",&m,&k)){
init();
int l=,r=,mid;
while(l<=r){
mid=(l+r)>>;
int tmp=getnum(mid);
if(tmp<k) l=mid+;
else if(tmp>k) r=mid-;
else
ans=mid,r=mid-;
}
printf("%d\n",ans);
}
return ;
}
poj2773(欧基里德算法 或 二分+容斥)的更多相关文章
- codeforces B. Friends and Presents(二分+容斥)
题意:从1....v这些数中找到c1个数不能被x整除,c2个数不能被y整除! 并且这c1个数和这c2个数没有相同的!给定c1, c2, x, y, 求最小的v的值! 思路: 二分+容斥,二分找到v的值 ...
- BZOJ 2440 [中山市选2011]完全平方数 二分+容斥
直接筛$\mu$?+爆算?再不行筛素数再筛个数?但不就是$\mu^2$的前缀和吗? 放...怕不是数论白学了$qwq$ 思路:二分+容斥 提交:两次(康了题解) 题解: 首先答案满足二分性质(递增), ...
- YYHS-分数(二分+容斥)
题目描述 KJDH是个十分善于探索的孩子,有一天他把分子分母小于等于n的最简分数列在了纸上,他想找到这些分数里第k小的数,这对于KJDH来说当然是非常轻易,但是KJDH最近多了很多妹子,他还要去找妹子 ...
- 【二分+容斥+莫比乌斯反演】BZOJ2440 完全平方数
Description 求第k个没有完全平方因子的数,k<=1e9. Solution 这其实就是要求第k个µ[i](莫比乌斯函数)不为0的数. 然而k太大数组开不下来是吧,于是这么处理. 二分 ...
- 第k个互质数(二分 + 容斥)
描述两个数的a,b的gcd为1,即a,b互质,现在给你一个数m,你知道与它互质的第k个数是多少吗?与m互质的数按照升序排列. 输入 输入m ,k (1<=m<=1000000;1<= ...
- Codeforces 920G List Of Integers 二分 + 容斥
题目链接 题意 给定 \(x,p,k\),求大于 \(x\) 的第 \(k\) 个与 \(p\) 互质的数. 思路 参考 蒟蒻JHY. 二分答案 \(y\),再去 \(check\) 在 \([x,y ...
- Codeforces 920G(二分+容斥)
题意: 定义F(x,p)表示的是一个数列{y},其中gcd(y,p)=1且y>x 给出x,p,k,求出F(x,p)的第k项 x,p,k<=10^6 分析: 很容易想到先二分,再做差 然后问 ...
- Codeforces 483B - Friends and Presents(二分+容斥)
483B - Friends and Presents 思路:这个博客写的不错:http://www.cnblogs.com/windysai/p/4058235.html 代码: #include& ...
- codeforces 466C 计数 codeforces 483B 二分 容斥
题意:给你n个数,将他们分成连续的三个部分使得每个部分的和相同,求出分法的种数. 思路:用一个数组a[i]记下从第一个点到当前i点的总和.最后一个点是总和为sum的点,只需求出总和为1/3sum的点和 ...
随机推荐
- itertools模块、排列、组合、算法
关于列表重组的python小题 题目一:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例:输入: nums = ...
- react -搭建服务
import 'whatwg-fetch'; import 'es6-promise'; require('es6-promise').polyfill(); import * as common f ...
- Git 下拉项目
1.[VCS]> [Checkout from Version Control] > [Git] 2.项目Git路径 > [Clone]
- [转] Linux环境变量配置文件以及启动顺序
转自:https://blog.csdn.net/bjnihao/article/details/51775854 一.环境变量配置文件: 对所有用户都起作用 /etc/profile /etc/pr ...
- HTML中的超链接(Hyperlink)
超链接 ★超链接简单介绍 超链接可以说是网页中最常见的元素.超链接的英文名是hyperlink.每个网站都是由众多的网页组成,网页之间通常都是通过链接的方式相互关联的. 超链接能够让浏览者在各个独立的 ...
- Springboot 使用mybatis
Springboot 使用mybatis 依赖 pom.xml <?xml version="1.0" encoding="UTF-8"?> < ...
- 我不熟悉的list
其实在日常中,链表的题目做的比较多,但是使用STL自带链表的还是比较少,所以里面的一些API不大熟悉.这边也简要介绍一些. 基本的一些API 先列举的这些和上面几篇用法几乎一样,所以不再累述. 赋值相 ...
- kafka监控指标项
监控配置 kafka基本分为broker.producer.consumer三个子项,每一项的启动都需要用到 $KAFKA_HOME/bin/kafka-run-class.sh 脚本,在该脚本中 ...
- TCP之LAST_ACK状态
前提: A:主动关闭: B:被动关闭: A执行主动关闭,发送FIN,B收到FIN,发送ACK,进入CLOSE_WAIT,B发送FIN,进入LAST_ACK等待最后一个ACK到来: 关闭方式: (1) ...
- java期末课程总结
期末课程总结 转眼间,这个学期就要过去了,我们Java的学习也接近了尾声,回想到这个学期刚开始接触到Java的时候,感觉什么都不懂,但现在似乎有了门路,不会载懵懵懂懂, 虽然本学期面向对象与Java程 ...