遵义县住房和城乡建设局网站,建设银行网站用户名,制作手机网站用什么软件,企业营销网站制作CF1790E Vlad and a Pair of Numbers 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1思路代码实现题目
链接
https://www.luogu.com.cn/problem/CF1790E
字面描述
题面翻译
共有 ttt 组数据。
每组数据你会得到一个正整数 xxx…
CF1790E Vlad and a Pair of Numbers 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1思路代码实现题目
链接
https://www.luogu.com.cn/problem/CF1790E
字面描述
题面翻译
共有 ttt 组数据。
每组数据你会得到一个正整数 xxx你需要构造一组正整数 aaa 和 bbb满足 abx×2a b x \times 2abx×2 axorbxa \operatorname{xor} b xaxorbx其中 xor\operatorname{xor}xor 指异或。
输出你构造的 aaa 和 bbb。如有多解任意输出一解即可。如无解输出 −1-1−1。
1≤t≤1041 \leq t \leq 10^41≤t≤1041≤x≤2291 \leq x \leq 2^{29}1≤x≤229。同时你需要保证你构造的 aaabbb 满足 1≤a,b≤2301 \leq a,b \leq 2^{30}1≤a,b≤230。
题目描述
Vlad found two positive numbers $ a $ and $ b $ ( $ a,b0 $ ). He discovered that $ a \oplus b \frac{a b}{2} $ , where $ \oplus $ means the bitwise exclusive OR , and division is performed without rounding…
Since it is easier to remember one number than two, Vlad remembered only $ a\oplus b $ , let’s denote this number as $ x $ . Help him find any suitable $ a $ and $ b $ or tell him that they do not exist.
输入格式
The first line of the input data contains the single integer $ t $ ( $ 1 \le t \le 10^4 $ ) — the number of test cases in the test.
Each test case is described by a single integer $ x $ ( $ 1 \le x \le 2^{29} $ ) — the number that Vlad remembered.
输出格式
Output $ t $ lines, each of which is the answer to the corresponding test case. As the answer, output $ a $ and $ b $ ( $ 0 a,b \le 2^{32} $ ), such that $ x a \oplus b \frac{a b}{2} $ . If there are several answers, output any of them. If there are no matching pairs, output -1.
样例 #1
样例输入 #1
6
2
5
10
6
18
36样例输出 #1
3 1
-1
13 7
-1
25 11
50 22思路
根据题目 ab2x和aab2x和aab2x和a xorxorxor bxbxbx
我们能发现一个非常高重要的突破点a异或b流失了xa异或b流失了xa异或b流失了x ∴a按位与bx/2a按位与bx/2a按位与bx/2 ∵题目可输出任意解 ∴ax/2,bxx/2ax/2,bxx/2ax/2,bxx/2
但我们还要考虑一个无解的情况 当x是奇数时无法被2整除无解 当(x/2)按位与x!0(x/2)按位与x!0(x/2)按位与x!0有误无解
OK过程理完上代码
代码实现
#includebits/stdc.h
using namespace std;int t,n;
int main(){scanf(%d,t);while(t--){scanf(%d,n);if(n%21){printf(-1\n);continue;}if(((n/2)n)!0){printf(-1\n);continue;}printf(%d %d\n,n/2,n/2n);}return 0;
}