POJ 2773 Happy 2006 解题报告(容斥原理+质因数分解)
2014-03-09 10:52
477 查看
Happy 2006
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
Sample Output
解题报告:素数的这些东西,做多了都像类型题了。不过这题考察了二分的使用,还是不错的题。另外注意1的情况。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int prime[30];
int prime_num;
typedef long long LL;
LL co_prime(LL n)
{
LL ans = 0;
for(int i=1;i<(1<<prime_num);i++)
{
LL tmp = 1;
bool flag = false;
for(int j=0;j<prime_num;j++) if(i&(1<<j))
tmp = tmp*prime[j],flag = !flag;
ans += n/tmp*(flag?1:-1);
}
return n - ans;
}
int main()
{
int n;
LL k;
while(~scanf("%d%lld", &n, &k))
{
if(n==1)
{
printf("%lld\n", k);
continue;
}
prime_num = 0;
for(int i=2;i*i<=n;i++) if(n%i==0)
{
prime[prime_num++] = i;
while(n%i==0) n/=i;
}
if(n>1) prime[prime_num++] = n;
LL l = 1, r = 1ll<<40;
while(l<=r)
{
LL m = (l+r)/2;
if(co_prime(m)>=k)
r = m-1;
else
l = m+1;
}
printf("%lld\n", l);
}
}
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 9002 | Accepted: 3013 |
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
解题报告:素数的这些东西,做多了都像类型题了。不过这题考察了二分的使用,还是不错的题。另外注意1的情况。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int prime[30];
int prime_num;
typedef long long LL;
LL co_prime(LL n)
{
LL ans = 0;
for(int i=1;i<(1<<prime_num);i++)
{
LL tmp = 1;
bool flag = false;
for(int j=0;j<prime_num;j++) if(i&(1<<j))
tmp = tmp*prime[j],flag = !flag;
ans += n/tmp*(flag?1:-1);
}
return n - ans;
}
int main()
{
int n;
LL k;
while(~scanf("%d%lld", &n, &k))
{
if(n==1)
{
printf("%lld\n", k);
continue;
}
prime_num = 0;
for(int i=2;i*i<=n;i++) if(n%i==0)
{
prime[prime_num++] = i;
while(n%i==0) n/=i;
}
if(n>1) prime[prime_num++] = n;
LL l = 1, r = 1ll<<40;
while(l<=r)
{
LL m = (l+r)/2;
if(co_prime(m)>=k)
r = m-1;
else
l = m+1;
}
printf("%lld\n", l);
}
}
相关文章推荐
- poj 2773 Happy 2006解题报告 <欧拉函数>
- POJ-2773-Happy 2006 解题报告
- POJ 2773 Happy 2006 [容斥原理]
- POJ2773 Happy 2006【容斥原理】
- POJ 2773 Happy 2006 (容斥原理)
- POJ 2773 Happy 2006(容斥原理)
- [二分+容斥原理] poj 2773 Happy 2006
- poj 2773 Happy 2006(容斥原理)
- poj 2773 Happy 2006 - 二分答案 - 容斥原理
- 【容斥原理】【poj 2773】Happy 2006
- poj 2773 Happy 2006(容斥原理+二分)
- POJ 2773 Happy 2006(容斥原理+二分)
- 【疑】poj 2773 Happy 2006 互素问题(★★☆☆☆)
- POJ-2773 Happy 2006(容斥,二分,dfs)
- POJ 2773 Happy 2006 二分+容斥(入门
- POJ 1091 跳蚤 解题报告(2014携程第一场A题,聪明的猴子)(容斥原理)
- POJ 2773 Happy 2006 【数论,容斥原理+二分】
- poj 2773 Happy 2006——欧拉函数
- POJ 2773 Happy 2006 (容斥)
- poj 2773 Happy 2006