[CF920G]List Of Integers

Posted list1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF920G]List Of Integers相关的知识,希望对你有一定的参考价值。

Description:

(t)组询问,求第(k)个大于(x)且与(p)互质的数

Hint:

(x,k,p<=1e6,t<=30000)

Solution:

推出式子后,由于要求第k大,二分答案就好了

#include<bits/stdc++.h>
using namespace std;
const int mxn=1e6+5;
int tot,vis[mxn],mu[mxn],sum[mxn],p[mxn];

void sieve(int lim) 
{
    mu[1]=1;
    for(int i=2;i<=lim;++i) {
        if(!vis[i]) mu[i]=-1,p[++tot]=i;
        for(int j=1;j<=tot&&p[j]*i<=lim;++j) {
            vis[p[j]*i]=1;
            if(i%p[j]==0) {
                mu[p[j]*i]=0;
                break;
            }
            mu[p[j]*i]=-mu[i];
        }
    }
    for(int i=1;i<=lim;++i) sum[i]=sum[i-1]+mu[i];
}

int check(int x,int p)
{
    int ans=0;
    for(int i=1;i<=sqrt(p);++i) 
        if(p%i==0) {
            ans+=mu[i]*(x/i);
            if(i*i!=p) ans+=mu[p/i]*(x/(p/i)); //这里很重要,直接将O(n)的check优化到了O(√n)
        }
        
    return ans; 
}

int main()
{
    int t,x,p,k;
    scanf("%d",&t); sieve(1000000);
    while(t--) {
        scanf("%d%d%d",&x,&p,&k);
        int l=x+k-1,r=9e6+5;
        while(l<r) {
            int mid=(l+r)>>1;
            if(check(mid,p)-check(x,p)>=k) r=mid;
            else l=mid+1;
        }
        printf("%d
",r);
    }
    return 0;
}

以上是关于[CF920G]List Of Integers的主要内容,如果未能解决你的问题,请参考以下文章

[cf920G][容斥原理+二分]

Educational Codeforces Round 37 (Rated for Div. 2)G. List Of Integers 二分

CF 466C Number of Ways(数学 / 思维 / DP)

CF870A Search for Pretty Integers

CF1548B Integers Have Friends

LeetcodeSum of Two Integers