Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 11161   Accepted: 3893

Description

Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7, 9...are all relatively prime to 2006.

Now your job is easy: for the given integer m, find the K-th element which is relatively prime to m when these elements are sorted in ascending order.

Input

The input contains multiple test cases. For each test case, it contains two integers m (1 <= m <= 1000000), K (1 <= K <= 100000000).

Output

Output the K-th element in a single line.

Sample Input

2006 1
2006 2
2006 3

Sample Output

1
3
5

Source


  想说一下这题的大意,就是找出与m互质的第k个数

  这明显是一道数论的题,开始没有想到什么好的方法就暴力,毫无疑问TLE(注:正确的暴力是不会超时的)

  后来找了几份题解看了看,找的了正确的做法,用容斥原理求出和它不互质的个数,拿n一减,个数就出来了,

不过这仍然存在一个问题,上面的TLE又跳了出来,又因为这里1到n(1<=n<=m)中间,n的值越大,与m互质

的数更多,很符合二分的特点

  下面问题就变成了给了你一个从小到大排列的数组,找到k最早出现的位置(想想为什么,因为当从k-1增加到

第k个的时候,k一定与m互质,所以才会增加一个互质的数)

  接下来问题就变得十分简单了,附上秒过的代码(第一次提交手抽,把某个地方的limit打成m,导致速度110ms)

Code:

 /**
* poj.org
* Problem#2773
* Accepted
* Time:0ms
* Memory:172k
*/
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef bool boolean;
typedef long long ll;
int m;
ll k;
int factor[];
int _count;
/***
* 分解质因数
*/
void init(int n){
_count = ;
int limit = (int) sqrt(n + 0.5);
for(int i = ;i <= limit;i++){ //不用考虑i是否为指数
if(n == ) break;
if(n % i == ){
factor[_count++] = i; //保存质因数
while(n % i == ) n /= i; //除干净
}
}
if(n > ) factor[_count++] = n;
}
ll getCount(ll n){
if(m == ) return n;
if(n == ) return ;
long long result = n;
for(int i = ;i < ( << _count );i++){ //遍历所有情况
long long temp = i, a = , b = ;
for(int j = ;j < _count&&temp != ;j++){
if((temp & )== ){ //用1来表示取第i个质数,0表示不去
a *= factor[j]; //分母的乘积
b++; //统计个数
}
temp >>= ;
}
if((b&)==) result -= n/a; //个数为奇数,根据容斥原理,应该减
else result += n/a; //个数为偶数,应该加
}
return result;
}
int main(){
while(~scanf("%d%ld",&m,&k)){ //当没有收到数据的时候是EOF(-1)取反后是0(false)
if(m == ){
printf("%ld\n",k);
continue;
}
if(k == ){
printf("1\n"); //特殊处理,加快速度
continue;
}
ll from = ;
ll end = 1LL<<;
ll result;
init(m);
while(from <= end){ //二分查找
ll mid = (from + end) >> ;
ll c = getCount(mid); //计算个数
if(c > k) end = mid - ;
else if(c < k) from = mid + ;
else{ //这里不可以break,二分找到的第一个不一定是答案
result = mid; //例如数列1 1 1 2 3查找1,第一次找到的1不一定是最左边的
end = mid - ;
}
}
printf("%ld\n",result);
}
return ;
}

poj 2773 Happy 2006 - 二分答案 - 容斥原理的更多相关文章

  1. POJ 2773 Happy 2006#素数筛选+容斥原理+二分

    http://poj.org/problem?id=2773 说实话这道题..一点都不Happy好吗 似乎还可以用欧拉函数来解这道题,但正好刚学了容斥原理和二分,就用这个解法吧. 题解:要求输出[1, ...

  2. POJ 1064 Cable master (二分答案)

    题目链接:http://poj.org/problem?id=1064 有n条绳子,长度分别是Li.问你要是从中切出m条长度相同的绳子,问你这m条绳子每条最长是多少. 二分答案,尤其注意精度问题.我觉 ...

  3. POJ 3484 Showstopper(二分答案)

    [题目链接] http://poj.org/problem?id=3484 [题目大意] 给出n个等差数列的首项末项和公差.求在数列中出现奇数次的数.题目保证至多只有一个数符合要求. [题解] 因为只 ...

  4. POJ 3579 Median(二分答案+Two pointers)

    [题目链接] http://poj.org/problem?id=3579 [题目大意] 给出一个数列,求两两差值绝对值的中位数. [题解] 因为如果直接计算中位数的话,数量过于庞大,难以有效计算, ...

  5. 2019.02.09 bzoj2440: [中山市选2011]完全平方数(二分答案+容斥原理)

    传送门 题意简述:qqq次询问(q≤500)(q\le500)(q≤500),每次问第kkk个不被除111以外的完全平方数整除的数是多少(k≤1e9)(k\le1e9)(k≤1e9). 思路:考虑二分 ...

  6. BZOJ 2440 中山市选2011 全然平方数 二分答案+容斥原理+莫比乌斯反演

    题目大意:求第k个无平方因子数是多少(无视原题干.1也是全然平方数那岂不是一个数也送不出去了? 无平方因子数(square-free number),即质因数分解之后全部质因数的次数都为1的数 首先二 ...

  7. {POJ}{3897}{Maze Stretching}{二分答案+BFS}

    题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...

  8. POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)

    <题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...

  9. POJ 3061 Subsequence【二分答案】||【尺取法】

    <题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...

随机推荐

  1. are not called implicitly

    php.net <?php class BaseClass{ function __construct() { print "In BaseClass constructor<b ...

  2. 迷宫城堡--hdu1269(连通图)

    题目链接 连通图模板题:   #include<cstdio> #include<cstdlib> #include<cmath> #include<iost ...

  3. eclipse spket插件 错误 Syntax error on token "(", FunctionExpressionHeader expected after this

    在myEclipse抵抗了两个小时后,终于被spket插件搞上了.其实上学期自己也学过Ext.js,哈哈..慕名而来的. 但当时功力不足,不得以要停止修炼.可现在不同,java的基础和j2ee的ssh ...

  4. Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  5. (3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析

    (3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析 my.server主要分为3大部分 [1]变量初始化部分 [2]函数声明部分 [3]具体执行部分 #!/bin/sh # ...

  6. sql server中的日期详解使用(convert)

    转自:http://blog.csdn.net/hehe520347/article/details/48496853 有个字段值例如2012-07-02 00:00:00.000 转化成 2012- ...

  7. PHP主动断开与浏览器的连接

    以前整理过一篇<关于PHP连接处理中set_time_limit().connection_status()和ignore_user_abort()深入解析>,是解说浏览器client断开 ...

  8. POJ2488:A Knight's Journey(dfs)

    http://poj.org/problem?id=2488 Description Background The knight is getting bored of seeing the same ...

  9. 人活着系列之芳姐和芳姐的猪(Floyd)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2929 这个题一方面数据水,另一方面就是思维水, ...

  10. JavaScrip总体

    js: 简单对象: 数字 | 字符串 | 这三个像对象,有方法,但不可变 布尔值 | null undefined 对象:无类型,k-v对集合:函数.数组.REG.... JavaScript是一种l ...