poj 2773 Happy 2006 - 二分答案 - 容斥原理
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 11161 | Accepted: 3893 |
Description
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
Output
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 - 二分答案 - 容斥原理的更多相关文章
- POJ 2773 Happy 2006#素数筛选+容斥原理+二分
http://poj.org/problem?id=2773 说实话这道题..一点都不Happy好吗 似乎还可以用欧拉函数来解这道题,但正好刚学了容斥原理和二分,就用这个解法吧. 题解:要求输出[1, ...
- POJ 1064 Cable master (二分答案)
题目链接:http://poj.org/problem?id=1064 有n条绳子,长度分别是Li.问你要是从中切出m条长度相同的绳子,问你这m条绳子每条最长是多少. 二分答案,尤其注意精度问题.我觉 ...
- POJ 3484 Showstopper(二分答案)
[题目链接] http://poj.org/problem?id=3484 [题目大意] 给出n个等差数列的首项末项和公差.求在数列中出现奇数次的数.题目保证至多只有一个数符合要求. [题解] 因为只 ...
- POJ 3579 Median(二分答案+Two pointers)
[题目链接] http://poj.org/problem?id=3579 [题目大意] 给出一个数列,求两两差值绝对值的中位数. [题解] 因为如果直接计算中位数的话,数量过于庞大,难以有效计算, ...
- 2019.02.09 bzoj2440: [中山市选2011]完全平方数(二分答案+容斥原理)
传送门 题意简述:qqq次询问(q≤500)(q\le500)(q≤500),每次问第kkk个不被除111以外的完全平方数整除的数是多少(k≤1e9)(k\le1e9)(k≤1e9). 思路:考虑二分 ...
- BZOJ 2440 中山市选2011 全然平方数 二分答案+容斥原理+莫比乌斯反演
题目大意:求第k个无平方因子数是多少(无视原题干.1也是全然平方数那岂不是一个数也送不出去了? 无平方因子数(square-free number),即质因数分解之后全部质因数的次数都为1的数 首先二 ...
- {POJ}{3897}{Maze Stretching}{二分答案+BFS}
题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...
- POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)
<题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...
- POJ 3061 Subsequence【二分答案】||【尺取法】
<题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...
随机推荐
- dbAdmin 不等于 root 集合中角色
dbAdmin root 集合中角色 use admin创建 db.createUser( { user: "tmp_rw_56756", pwd: "tmp4242 ...
- VIM 文件编码识别与乱码处理(转载)
在 Vim 中,有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding 和 termencoding.在实际使用中,任何一个选项出现错误,都会导致出现乱 ...
- 解决windows7笔记本下玩游戏的显示问题
笔者是Windows7操作系统的粉丝,我的本本同样也是win7系统,和大家一样喜欢界面豪华漂亮,但包括笔者在内的不少用户总埋怨,在玩游戏时,游戏画面居中屏幕两边是黑条,无法全屏显示游戏画面.对于这个问 ...
- 理解SQL Server中索引的概念,原理
转自:http://www.cnblogs.com/CareySon/archive/2011/12/22/2297568.html 简介 在SQL Server中,索引是一种增强式的存在,这意味着, ...
- [py]监控内存并出图
监控内存出图 先将内存数据搞到数据库 已使用内存算法 used = int(total) - int(free) - int(butffers) - int(cache) pymysql模块使用 db ...
- Docker 后台进程参数-------更改Docker运行根目录的方法
参数 介绍 --api-enable-cors=false 远程API调用. -b, --bridge="" 桥接一个系统上的网桥设备到 Docker 容器里,当使用 none 可 ...
- PAT 1003 Emergency[图论]
1003 Emergency (25)(25 分) As an emergency rescue team leader of a city, you are given a special map ...
- [LeetCode] 312. Burst Balloons_hard tag: 区间Dynamic Programming
Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...
- MVC增加操作日志
在后台管理中,有一些操作是需要增加操作日志的,尤其是对一些比较敏感的金额类的操作,比如商城类的修改商品金额.删除商品.赠送金额等人工的操作.日志中记录着相关操作人的操作信息,这样,出了问题也容易排查. ...
- input的text输入框设置大一点
<input type="text" style="height:51px;width:449px;font-size:12px;">12可以随意改 ...