cf920 G. List Of Integers

题意:

\(List(>x,p)\) 表示大于 \(x\) 且与 \(p\) 互质的整数数列,从小到大排列。给定 \(x,p,k\),问数列中的第 \(k\) 个数是多少

思路:

(似乎很多求xx数列中的第k个数的题都是二分)

二分答案,\(p\) 的质因子数很少所以可以用最朴素的容斥判断

int x, p, k;
vector<int> divs; int cnt;

int get(int n) { // [1,n]中与p不互质的数的个数
    int res = 0;
    for(int S = (1<<cnt)-1; S >= 1; S--) {
        int mul = 1; for(int i = 0; i < cnt; i++)
            if(S>>i&1) mul *= divs[i];
        res += n / mul * (__builtin_popcount(S) % 2 ? 1 : -1);
    }
    return res;
}

void sol() {
    cin >> x >> p >> k;
    
    divs.clear(); //找所有质因子
    for(int i = 2; i <= p / i; i++) if(p % i == 0) {
        divs.push_back(i); while(p % i == 0) p /= i;
    } if(p > 1) divs.push_back(p);
    cnt = divs.size();
    
    int getx = get(x);
    int l = x+1, r = 1e7; while(l < r) {
        int mid = l + r >> 1;
        if(mid - x - (get(mid) - getx) >= k) r = mid;
        else l = mid + 1;
    }
    cout << l << '\n';
}
posted @ 2022-09-05 16:11  Bellala  阅读(50)  评论(0)    收藏  举报