题目描述;
给一个数x,问存在多少个a 满足 a ^ x > x 且 0 < a < x (^为异或)
重点内容
神他妈规律
解法一
打表(一定找较小的数,大数的话会看不出来)
99

1
0

10
5

100
27

1000
23

500
11

240
15
由表可以看出,跑2的倍数刚好大与n时,得到的数正好为n与答案的和+1,由此得出解法一

#include <iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<cstdlib>
using namespace std;

int main()
{
    long long n,sum,kk;
    int t;
    cin>>t;
    //cout<<endl;
    while(t--)
    {
        cin>>n;
        sum = 1;
        for(int i=1;sum<n+1;i++)
        {
            sum*=2;
        }
        cout<<sum-1-n<<endl;
        //cout<<endl;
    }
    return 0;
}

解法2:比较正常的想法
想一下n的二进制位表示,当n的第i位为0时,此时它的低位无论是0,1都是没有影响的,故对于每一个第i位为0,对于答案的贡献是2^i,求和即可
注意:数据类型一定要统一,保险起见都用 Long long

#include <iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<cstdlib>
using namespace std;

int main()
{
    long long n,sum,kk;
    int t;
    cin>>t;
    //cout<<endl;
    while(t--)
    {
        cin>>n;
        sum = 0;
        long long xx = 1;
        while(n)
        {
            if(n%2==0)
                sum+=xx;
            xx*=2;
            n/=2;
        }
        cout<<sum<<endl;
        //cout<<endl;
    }
    return 0;
}