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的点和 ...
随机推荐
- 【leetcode】1187. Make Array Strictly Increasing
题目如下: Given two integer arrays arr1 and arr2, return the minimum number of operations (possibly zero ...
- Harbor ($docker login) Error saving credentials
$ sudo apt-get install $ sudo apt-get install gnupg2 pass 问题解决!
- Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页
1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...
- QT:QSS字体设置
css,qss font-family常用的黑体宋体等字体中英文对照 当qss使用中文设置字体时,无法生效.因为qss不支持中文设置字体,所以下面给出一些常用的黑体宋体字体中英文对照. 微软雅黑: M ...
- head first 设计模式笔记5-单例模式
目录: 1.单例模式(Singleton Pattern) 2.概念 3.饿汉式:不是延迟加载,加载类的时候直接初始化 4.懒汉式:延迟加载,首次需要使用的时候在实例化,需要考虑线程安全 5.静态内部 ...
- SpringBoot项目中,获取配置文件信息
1.在配置文件中设置信息,格式如下 wechat: mpAppId: wxdf2b09f280e6e6e2 mpAppSecret: f924b2e9f140ac98f9cb5317a8951c71 ...
- openwrt python27库的选择和库的大小
< > micropython................................................. Micro Python < > microp ...
- BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)
题目链接 (luogu) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...
- Android_(控件)Chronometer计时器
Android Chronometer(计时器) 继承TextView,显示的是某个时间点开始以及之后的时间增加 运行截图 程序结构 package com.example.administrator ...
- iOS检测QQ是否安装
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqq://"]]) { ...