题意:定义f(n,m)为比n大的第m大的与n互质的数,然后给你m和k,问你满足的最小n为多少
题解:其实以上那个公式翻译一下就是,所求互质的数与n的间隔 异或n=k,所以把间隔异或到右面,即 n = k xor (f(n,m)-n),
这样枚举一下间隔就行了,(m只有100,所以间隔枚举到1000就够了),求出对应的n再判断一下符不符合要求,取个最小的n就可以了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define mem(s) memset(s, 0, sizeof(s))
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int maxn = 1e6+5;
const int mod = 998244353;
int a[maxn];
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
ll get(ll n,ll m){
ll flag=0;
for(ll i=n+1;;i++){
if(gcd(i,n)==1){
flag++;
}
if(flag==m)return i;
}
}
int main()
{
//cout<<gcd(8,6)<<endl;
int t;
scanf("%d",&t);
while(t--){
ll k,m;
scanf("%lld%lld",&k,&m);
ll ans=1e18;
for(int i=1;i<=1000;i++){
if((k^i)==0)continue;
ll n=k^i;
if(((get(n,m)-n)^n)==k){
ans=min(ans,n);
}
}
printf("%lld\n",ans==1e18?-1:ans);
}
return 0;
}