Problem Description
For a positive integer
n, let's denote function f(n,m) as the m-th smallest integer x that x>n and gcd(x,n)=1. For example, f(5,1)=6 and f(5,5)=11.
You are given the value of m and (f(n,m)−n)⊕n, where ``⊕'' denotes the bitwise XOR operation. Please write a program to find the smallest positive integer n that (f(n,m)−n)⊕n=k, or determine it is impossible.
You are given the value of m and (f(n,m)−n)⊕n, where ``⊕'' denotes the bitwise XOR operation. Please write a program to find the smallest positive integer n that (f(n,m)−n)⊕n=k, or determine it is impossible.
Input
The first line of the input contains an integer
T(1≤T≤10), denoting the number of test cases.
In each test case, there are two integers k,m(1≤k≤1018,1≤m≤100).
In each test case, there are two integers k,m(1≤k≤1018,1≤m≤100).
Output
For each test case, print a single line containing an integer, denoting the smallest
n. If there is no solution, output ``-1'' instead.
Sample Input
2 3 5 6 100
Sample Output
5 -1
Source
题解:
/// /// _ooOoo_ /// o8888888o /// 88" . "88 /// (| -_- |) /// O\ = /O /// ____/`---'\____ /// .' \\| |// `. /// / \\||| : |||// \ /// / _||||| -:- |||||- \ /// | | \\\ - /// | | /// | \_| ''\---/'' | | /// \ .-\__ `-` ___/-. / /// ___`. .' /--.--\ `. . __ /// ."" '< `.___\_<|>_/___.' >'"". /// | | : `- \`.;`\ _ /`;.`/ - ` : | | /// \ \ `-. \_ __\ /__ _/ .-` / / /// ======`-.____`-.___\_____/___.-`____.-'====== /// `=---=' /// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /// Buddha Bless, No Bug ! /// #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <cstdlib> #include <queue> #include <stack> #include <vector> using namespace std; #define MAXN 100010 #define ll long long int t, m; ll k, ans_n; ll cal(ll n, int m) { if(n < 1) return 0; for(ll i = n + 1; ; i++) if(__gcd(n, i) == 1) { m--; if(m == 0) return i - n;/// (i - n) = (f(n, m) - n) = d } } int main() { scanf("%d", &t); while(t--) { scanf("%lld%d", &k, &m); ans_n = -1; for(int d = 1; d <= 1000; d++) { if(cal(k ^ d, m) == d) { if(ans_n == -1) ans_n = k ^ d; else if(ans_n > (d ^ k))/// ^ 运算的有优先度小于 < > == != ans_n = k ^ d; } } printf("%lld\n", ans_n); } return 0; }