hdu3388Coprime 二分+容斥原理

//找第k个和n,m互质的数

//由容斥原理可得

//在[1,x]范围内且与n不互质的数的个数为:

//对于所有的n的素数因子:和一个素数因子不互质的个数-两个素数因子相乘的个数+三个素数因子相乘的个数-.....

//对于x越大,在[1 , x]范围内的与n,m互质的数越多,所以存在单调性,可以用二分找到刚好有k个数和n,m互质

#include<cstdio>

#include<cstring>

#include<iostream>

#include<map>

using namespace std ;

typedef __int64 ll ;

const int maxn = 100010 ;

const int inf = 1e9 ;

map<int , int>ma ;

ll p[maxn] ;

int len ;

void getprime(ll n)

{

for(int i = 2;i*i <= n;i++)

{

if(n%i == 0 && !ma[i])

{

p[++len] = i ;

ma[i] = 1;

}

while(n%i == 0)n/=(ll)i ;

}

if(n > 1 && !ma[n]){p[++len] = n;ma[n]=1;}

}

ll dfs(int pos , ll n)

{

ll ans = 0 ;

for(int i = pos ;i <= len ;i++)

ans += n/p[i] - dfs(i+1 , n/p[i]) ;

return ans ;

}

ll find(ll l , ll r , ll num )

{

while(l <= r)

{

ll mid = (l+r) >> 1 ;

if((mid - dfs(1 , mid)) < num)

l = mid + 1 ;

else r = mid - 1;

}

return l ;

}

int main()

{

//  freopen("in.txt","r",stdin) ;

// freopen("out.txt","w" ,stdout) ;

int T ;int cas = 0 ;

int n , m ;int k ;

scanf("%d" , &T) ;

while(T--)

{

scanf("%d%d%d"  ,&n , &m , &k) ;

len = 0 ;

ma.clear() ;

getprime((ll)(n));

getprime((ll)(m));

ll ans = find(1 , (ll)inf*(ll)inf, (ll)k);

printf("Case %d: " , ++cas) ;

printf("%I64d\n" , ans) ;

}

return 0;

}

时间: 2024-10-13 02:12:48

hdu3388Coprime 二分+容斥原理的相关文章

[二分+容斥原理] poj 2773 Happy 2006

题目链接: http://poj.org/problem?id=2773 Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9131   Accepted: 3073 Description Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1.

Codeforces483B. Friends and Presents(二分+容斥原理)

题目链接:传送门 题目: B. Friends and Presents time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You have two friends. You want to present each of them several positive integers. You want to present cn

ubuntu,从新建一个用户,到转到新建用户的命令行操作

题目链接: http://poj.org/problem?id=2773 Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9131   Accepted: 3073 Description Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1.

几个解决k染色问题的指数级做法

几个解决k染色问题的指数级做法 ——以及CF908H题解 给你一张n个点的普通无向图,让你给每个点染上k种颜色中的一种,要求对于每条边,两个端点的颜色不能相同,问你是否存在一种可行方案,或是让你输出一种可行方案,或是让你求出满足条件的最小的k.这种问题叫做k染色问题.众所周知,当k>2时,k染色问题是NP的.但是相比$O(k^n)$的暴力搜索来说,人们还是找到了很多复杂度比较优越的指数级做法.本文简单介绍其中几种. 因为对于$O(n^22^n)$来说,$O(n^2)$小得可以忽略不计,所以在本文

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

http://poj.org/problem?id=2773 说实话这道题..一点都不Happy好吗 似乎还可以用欧拉函数来解这道题,但正好刚学了容斥原理和二分,就用这个解法吧. 题解:要求输出[1,m]中与m互质的第k个数,先打表,找到m的所有质因数,然后用二分实现,最开始区间为[1,2^60],利用容斥原理去找区间[1,mid]内素数的个数t,不断进行二分,直到所查找的区间[l,r]内素数的个数t等于k,mid=l=r,则此时的l就是第k个与m互质的数. #include<iostream>

BZOJ 2440: [中山市选2011]完全平方数(二分答案 + 莫比乌斯函数 + 容斥原理)

传送门 2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2693  Solved: 1307[Submit][Status][Discuss] Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送

[BZOJ 2440][中山市选2011]完全平方数(容斥原理/莫比乌斯函数+二分)

Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一 个小X讨厌的数.他列出了所有小X不讨厌的数,然后选取了第 K个数送给了 小X.小X很开心地收下了. 然而现在小 W 却记不起送给小X的是哪个数了.你能帮他一下吗? Solution 二分答案,于是问题转化成了如何求出不含完全平方数因

【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定

2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Status][Discuss] Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一个小X讨厌

【BZOJ】2440: [中山市选2011]完全平方数(莫比乌斯+容斥原理+二分)

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 我觉得网上很多题解都没说清楚...(还是我太弱了? 首先我们可以将问题转换为判定性问题,即给出一个数x,有多少个小于x等于的数是不能分解的,即不是完全平方数(不包括1). 而每个数都可以写成质数积,那么显然只要质数的平方的倍数就可以代替所有数的平方的倍数. 考虑质数个数,假设质数集$P$,那么根据容斥原理,在x范围内的正整数能分解的个数有: $$(A_{p_1} + A_{p_2} + \c