zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    SuperMap关联外部数据库
    617Tips
    第一次上课
    文本字段也可做自定义专题图
    Oracle笔记一
    Oracle笔记二
    复制追加数据集失败
    夏季恋语
    最浪漫的事
    爱了你那么多年
  • 原文地址:https://www.cnblogs.com/list1/p/10372063.html
Copyright © 2011-2022 走看看