阿里云笔试 阿里云笔试题 0410

笔试时间:2025年04月10日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目

小红拿到了一个正整数x,她希望你找到两个正整数a,b(a<=b),满足a\oplus b。如果有多解,请你输出max(a, b)最小的那个解。

输入描述

第一行输入一个正整数t,代表询问次数。

接下来的行t,每行输入一个正整数x,代表一次询问。

输出描述

每行输出两个正整数a, b,代表该次询问的答案。

可以证明,在满足题意的情况下,答案一定存在且唯一。

样例输入

2

2

3

样例输出

1 3

1 2

参考题解

思维题,通过观察,如果x为1的话需要特殊处理,如果x为2的次幂,那么只需要输出1和(x+1)即可,对于其他的情况,找到组成x的最大的2次幂y,答案即为(x-y)和y。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <bits/stdc++.h>
usingnamespacestd;
int main() {
    int T;
    cin >> T;
    for(int i = 0; i < T; i++) {
        longlong x;
        cin >> x;
        if(x == 1) {
            cout << "2 3" << endl;
            continue;
        }
        int cnt = 0;
        longlong y = 0;
        for(int w = 0; w < 40; w++) {
            longlong now = x & (1LL << w);
            if(now != 0) {
                y = (1LL << w);
                cnt++;
            }
        }
        if(cnt == 1) cout << 1 << " " << (y + 1) << endl;
        elsecout << (x - y) << " " << y << endl;
    }
    return0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();

        while (T-- > 0) {
            long x = sc.nextLong();

            if (x == 1) {
                System.out.println("2 3");
                continue;
            }

            int cnt = 0;
            long y = 0;

            for (int w = 0; w < 40; w++) {
                long now = x & (1L << w);
                if (now != 0) {
                    y = (1L << w);
                    cnt++;
                }
            }

            if (cnt == 1) {
                System.out.println("1 " + (y + 1));
            } else {
                System.out.println((x - y) + " " + y);
            }
        }

        sc.close();
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

T = int(input())

for _ in range(T):
    x = int(input())

    if x == 1:
        print("2 3")
        continue

    cnt = 0
    y = 0

    for w in range(40):
        if x & (1 << w):
            y = (1 << w)
            cnt += 1

    if cnt == 1:
        print(f"1 {y + 1}")
    else:
        print(f"{x - y} {y}")

第二题

题目:小红的数组异或

在神秘的数字世界里,每个数字都蕴含着独特的能量。传说中,当数组的异或和为0时,就能激发出平衡与神秘的力量,开启通往未知领域的大门。小红深信这一传说,并决心探索如何将普通的数字排列转变为拥有这种神奇能量的阵列。为此,她精心准备了一个大小为n的数组a。小红必须将其中一个数字修改成一个质数(如果本身就是一个质数,可以修改成自己本身),保持其他数字不变,从而使数组的异或和变为0。她想知道,有多少种修改方案,在一次修改后使数组的异或和变为0。

输入描述

第一行输入一个整数表示询问次数T。

对于每个询问:第一行输入一个整数n表示数组长度。

第二行输入n个整数表示数组a

输出描述

对于每个询问,输出一个整数表示有多少种修改方案,在一次修改后使数组的异或和变为0。

样例输入

2

4

1 2 3 4

5

1 2 3 4 5

样例输出

2

3

说明:

对于第一组样例,可以将1修改为5,也可以将3修改为7,从而使数组的异或和变为0。

对于第二组样例,可以将2修改为3,也可以将3修改为2,也可以将4修改为5,都可以使数组的异或和变为0。

参考题解

先预处理出所有质数。之后先计算数组总的异或和,然后遍历数组的每个元素,计算当前元素和总异或和的异或值,如果这个结果是质数则答案加一,最后输出最终答案即可。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <bits/stdc++.h>
usingnamespacestd;
constint m = 1e6;
vector<bool> sieve() {
    vector<bool> f(m + 1, true);
    f[0] = f[1] = false;
    for (int i = 2; i <= m; ++i) {
        if (!f[i]) continue;
        for (longlong j = (longlong)i * i; j <= m; j += i)
            f[j] = false;
    }
    return f;
}
int main() {
    vector<bool> f = sieve();
  

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务