1064B - Equations of Mathematical Magic(数学)

博客主要围绕方程a−(a⊕x)−x=0展开,指出不要直接输出pow()的值,会有bug。通过分析解题思路,将方程变形为x^a = x - a,对比运算符‘^’与‘-’的四种情况,得出当a二进制位为1时,x对应位可为0或1;a为0时,x对应位只能为0,a二进制中1的个数决定解的情况数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先:不要直接输出pow()的值,会有bug

题目大意
就是解一个方程:a−(a⊕x)−x=0 (a已知)
解题思路
a−(a⊕x)−x=0 <> a−(a^x)−x=0 <> x^a = x-a
如果运算符 ‘^’与 ‘-’起到相同的效果的话就是一个解
分析四种比较;
1^1=0 1-1=0
1^0=1 1-0=1
0^0=0 0-0=0,
0^1=1 0-1=-1
当a的二进制表示,如果这个位是1,则x对应的二进制对应的位数是0或者1都行;如果这个位是0,则x对应的二进制对应的位数只能是0。
所以,a的二进制表示有几个1就有2的几次方的情况。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e6 + 7;
//char str[maxn][maxn];
int a[maxn],b[maxn],c[maxn];
priority_queue <int,vector<int>,greater<int> > q;

int main(){
    int t;
    cin >> t;
    while(t--){
        ll x;
        ll sum = 0;
        cin >> x; 
        while(x){
            if(x&1){
                x/=2;
                sum++;
            }
            else {
                x/=2;
            }
        }
        //直接输出wa了几发
     int  ans = pow(2,sum) ;
         printf("%d\n",ans);
   }

    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值