阿里云笔试 阿里云笔试题 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等多种语言做法集合指南

