题意
设 $f(n, m)$ 为大于 $n$ 且与 $n$ 互质的数中第 $m$ 小的数,求满足 $(f(n, m) - n) oplus n = k$ 的最小正整数 $n$
分析
因为 $m leq 100$,很容易感觉到 $f(n, m) - n$ 是一个比较小的数,打表发现最多就300多。所以只对 $n$ 的低位有影响。而 $n$ 本身应该是与 $k$ 比较接近的数。
乱写一下,就AC了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll k, m; ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } ll f(ll n, ll m) { ll ret, cnt = 0; for(ll i = n+1;i < n + 1000; i++) { if(gcd(i, n) == 1) { cnt++; //printf("i:%lld cnt:%lld ",i, cnt); } if(cnt == m) { ret = i; break; } } return ret; } int main() { // for(ll i = 1000000000000000000;i < 1000000000000000050;i++) printf("%lld ", f(i, 100) - i); int T; scanf("%d", &T); while(T--) { ll ans = -1; scanf("%lld%lld", &k, &m); for(ll i = max(1LL, k - 500); i < k + 500;i++) { if(((f(i, m) - i) ^ i) == k) { ans = i; break; } } printf("%lld ", ans); } return 0; }