阿里云笔试 阿里云笔试题 0410
笔试时间:2025年04月10日
历史笔试传送门:
第一题
题目
小红拿到了一个正整数x,她希望你找到两个正整数a,b(a<=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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南