异或的逆运算 div3

【题目描述】给定整数n,c。满足ab=c。0<=a,b,c<=n(⊕符号表示异或。如 2的二进制为0010,6的二进制为0110,2⊕4=4为0100)求有几组整数数对(a,b)满足等式。

【输入】为多组测试样例。第一行输入T,代表有T组测试样例。1<=T<=10

              接下来T行每行输入n,c。0<=a,b,c<=n<=10^9

【输出】每行样例输出一个数代表有几组(a,b)满足等式。

【输入样例1】

2
10 3
20 5

【输出样例1】

10
18

【涉及主要算法或数据结构】位运算、异或的逆运算

【解题思路】

 这题不可以双重循环遍历a,b会时间超限。仅需要掌握异或运算的逆运算即可o(n)解决。当有ab=c,则有ac=b。因为有x0=x,x1=~x。(~x为x取反)所以我们可以假设a,b的二进制在同一位置上的数字为k和l,如果两数相同,则c在同一位置的数字为0,所以有k0=l同时也有l⊕0=k。若两数不同则k⊕l=1,且有l⊕1=~l=k和k⊕1=~k=l;所以异或的逆运算成立。

#include <iostream>
using namespace std;
int main()
{
    int t = 0;
    int n, c, i, j, k; 
    cin >> t;
    while (t--) {
        cin >> n>>c;
        int ans = 0;
        for (i = 0; i <= n; i++) {
            if ((i ^ c)<=n) {
                ans++;             
            }
        }
        cout << ans << endl;
    }    
    return 0;
}

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值