2021牛客多校7---HI

本文探讨了解决一个关于整数y与x进行或运算等于给定数s的问题,利用位操作和枚举方法,解释了如何确定符合条件的y的数量,并给出了两种解法。重点介绍了X&(-X)和x&=(x-1)在计算中的应用。

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

I xay loves or 点击查看 1813/7606 通过

在这里插入图片描述输入:

2 5

输出:

0

题意:

给出x和s,求有多少个整数y满足x or y == s

思路:

x|y>=x,根据或运算运算规则:0|0=0,1|0=1,0|1=1,1|1=1
原本的1位还是1, 0位则是有机会被置为1,因为要等于s,所以原本s的0位,x必须是0,即s&x==x必须满足,s的0位,x不能是1,否则答案就是0。
然后x的1位,y可以取0或者1,剩下的位s和x要一样,y也必须与之对应,所以答案是2^(x的1位个数)

由于y要是正整数,所以要去掉x==s,y=0的这种情况

解法1:

这一题的s的范围在1e7左右,所以可以暴力枚举

#include <iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
    int x,s,ans;
    cin>>x>>s;
    for(int i=1;i<=s;i++)//由于y是正整数,所以不从0开始枚举哦!
        if((x|i)==s)ans++;//从1开始枚举,一直到s
    cout<<ans<<endl;
    return 0;
}

我在写这个的代码的时候(x|i)这里忘记加括号了,就wa了,要记住哦,这种运算要加括号先运算哦!

解法二:

#include <iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
    int x,s;
    cin>>x>>s;
    if((s&x)!=x)//如果所给出的x、s本身就不妈祖题意
    {
        puts("0");
        return 0;
    }
    long long ans=1;
    for(int t=x;t;t-=t&(-t))
        //那么这里就是把他的1的个数给弄出来
        ans*=2;
    if(x==s)ans--;//排除x==s的情况,y=0
    cout<<ans<endl;
    return 0;
}

扩展

X&(-X)的含义:

当x是奇数的时候,答案一定是1
当x是偶数的时候,答案是能够整除x的最大的2的n次方幂
在这里插入图片描述

x&=(x-1)

就是将x的最后一位1变成0,这个跟上面的有着一样的功效,我们可以用他来统计一个数中1的个数

    int count(int x){
        int res=0;
        while(x>0){
            x&=(x-1);
            res++;
        }
        return res;
    }

lowbit()

lowbit()函数用来取一个二进制最低位的一与后边的0组成的数,他是需要自己编写的函数哦!

第一种写法

int lowbit(int x)
{
    return x&(-x);
}

第二种写法

int lowbit(int x)
{
    return x&(x^(x-1));
}

然后在学trie的时候也遇到了一种写法
但是他是看最后一位数是什么

x>>i&1

  for(int i=30;i>=0;i--)
    {
        int u=x>>i&1;//一位一位的看x是什么
    }

H xay loves count 点击查看 1690/4438 通过

在这里插入图片描述
输入

3
1 1 1

输出

27

输入

5
1 2 4 8 16

输出

15

暴力枚举,妙啊!

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N=1e6+10;
int a[N];

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        a[x]++;
    }
    LL ans=0;
    for(int i=1;i<N;i++)
        for(int j=1;j<N;j++)
        ans+=a[i]*a[j]*a[i*j];
    printf("%d\n",ans);
    return 0;
}

### 关于京东网技术运维工程师笔试题目与经验 #### 笔试内容概述 技术运维工程师的笔试通常会涉及计算机基础、网络协议、操作系统原理以及实际问题解决能力等方面的知识。根据以往的经验,京东的技术运维工程师笔试可能包括但不限于以下几个方面[^1]: - **基础知识**:数据结构与算法的基础应用,例如数组、链表的操作,排序算法的选择与实现。 - **网络知识**:TCP/IP 协议栈的理解,HTTP/HTTPS 的工作流程,DNS 解析过程等。 - **Linux 操作系统**:Shell 编程、进程管理、文件权限控制等内容。 - **数据库操作**:SQL 查询语句优化,索引设计,事务处理机制。 以下是几个常见的考察方向及其对应的示例问题: #### 数据结构与算法实例 ```python def find_missing_number(nums): n = len(nums) + 1 expected_sum = n * (n + 1) // 2 actual_sum = sum(nums) return expected_sum - actual_sum ``` 此函数用于在一个长度为 `n` 的列表中找到缺失的一个整数,假设该列表原本应包含从 1 到 `n` 的连续正整数序列[^1]。 #### Linux Shell 实现脚本 编写一个简单的 Bash 脚本来监控磁盘空间并发送警告邮件给管理员: ```bash #!/bin/bash THRESHOLD=90 CURRENT=$(df / | grep / | awk '{ print $5}' | sed 's/%//g') if [ "$CURRENT" -gt "$THRESHOLD" ]; then echo "Warning: Disk space is low." | mail -s "Disk Space Alert" admin@example.com fi ``` 这段代码展示了如何通过命令行工具检测根目录下的可用存储容量,并在超过设定阈值时触发警报通知[^3]。 #### SQL 查询技巧 对于大规模关系型数据库中的性能调优而言,合理创建复合索引可以显著提升查询效率。比如,在一张记录用户活动日志的大表里查找特定时间段内的活跃用户数量时,应该考虑对日期字段建立覆盖索引来减少全表扫描带来的开销。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值