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';
}

浙公网安备 33010602011771号