List Of Integers

List Of Integers

https://ac.nowcoder.com/acm/problem/112558

分析

我们考虑弱化版本:对于求一定范围内与互质的数个数
那么就是

所以答案就是枚举所有的质因子,进行简单容斥即可
所以我们需要知道容斥系数
这里我们就可以利用莫比乌斯函数的另一种用途了:作为质因子的容斥系数
因为莫比乌斯函数满足

所以我们直接线性筛所有的莫比乌斯函数
再二分答案判断即可
时间复杂度:

代码

//CF920G
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

#define LL long long
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(int i=A;i<=B;i++)
#define BOR(i,A,B) for(int i=A;i>=B;i--)
#define Lowbit(X) (X & (-X))
#define INF 0x3f3f3f3f
#define Rson (X<<1|1)
#define Lson (X<<1)
using namespace std;
const int MaxN=1e6+10;

int Mu[MaxN],Prime[MaxN],Cnt;
bool Jud[MaxN];
int Test,K,X,P;
int Ans;

inline void File() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}

inline void Init() {
    Jud[1]=true;
    Mu[1]=1;
    FOR(i,2,MaxN-5) {
        if(!Jud[i]) Prime[++Cnt]=i,Mu[i]=-1;
        for(int j=1;j<=Cnt && Prime[j]*i<=MaxN-5;j++) {
            Jud[Prime[j]*i]=true;
            if(!(i%Prime[j])) {
                Mu[i*Prime[j]]=0;
                break;
            }
            Mu[i*Prime[j]]=-Mu[i];
        }
    }
}

inline int Find(int New,int Base) {
    int Res=0;
    for(int i=1;i*i<=Base;i++) {
        if(Base%i) continue;
        Res+=Mu[i]*(New/i);
        if(i!=(Base/i)) { Res+=Mu[Base/i]*(New/(Base/i)); }
    }
    return Res;
}

int main() {
    // File();
    ios::sync_with_stdio(false);
    cin>>Test;
    Init();
    while(Test--) {
        cin>>X>>P>>K;
        Ans=0;
        K+=Find(X,P);
        int L=X,R=X+10*K;
        while(L<=R) {
            int Mid=(L+R)>>1;
            if(Find(Mid,P)>=K) { R=Mid-1; Ans=Mid; }
            else { L=Mid+1; }
        }
        cout<<Ans<<endl;
    }
    // fclose(stdin);
    // fclose(stdout);
    system("pause");
    return 0;
}
全部评论

相关推荐

3 1 评论
分享
牛客网
牛客企业服务