抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

一方の笔记本

The only source of knowledge is experience.

题目发布于2021年9月30日上午十点。

Problem A

题目描述

如果一个质数能被表示为三个不同的质数的和的形式,那么我们称它为立方质数。

现在给你一个数\(n(n \leq 1000)\),判断它是不是立方质数。

题解

观察\(n\)的范围,直接暴力枚举即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
bool is_prime(int n) {
if (!(n % 2)) {
return false;
}
if (n == 1) {
return false;
}
for (int i = 3; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}

int main() {
vector<int> primeList;
int n;
cin >> n;
if (!is_prime(n)) {
cout << "No" << endl;
return 0;
}
for (int i = 2; i <= n; i++) {
if (is_prime(i)) {
primeList.push_back(i);
}
}
int l = primeList.size();
for (int i = 0; i < l; i++) {
for (int j = i + 1; j < l; j++) {
for (int k = j + 1; k < l; k++) {
if (n == primeList[i] + primeList[j] + primeList[k]) {
cout << "Yes" << endl;
return 0;
}
}
}
}
cout << "No" << endl;
return 0;
}

Problem B

题目描述

\(n\)盏灯,编号为\(1,2,\dots,n\),初始灯都是关着的。有\(n\)个人,第\(i\)个人会打开所有编号为\(i\)的倍数的灯,那么最后有几盏灯是亮着的?

题解

实际上,仔细读题发现,最后只有被按了奇数次的灯会亮着,也就是说,本题是求在区间\([1, n]\)中的整数\(i\)满足条件当且仅当\(i\)恰好有奇数个不同的因数。大于\(1\)的任意一个正整数的因数都是成对出现的,除非这个数是完全平方数。说到底,这个题就是要求\([1, n]\)中有多少个完全平方数。直接返回\(\lfloor \sqrt{n} \rfloor\)即可。

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int i;
for(i = 1; i * i <= n; i++){}
cout << i - 1 << endl;
return 0;
}

Problem C

题目描述

小明刚买了一个机械键盘,但他在用机械键盘打字的时候发现键盘的Home键和End键坏掉了,于是他在打字的时候光标有时会突然跑到行首,有时又会突然跑到行尾,现在给你键盘的输入,求最后屏幕上的字符串。

题解

实际上需要费脑筋的是输入多个home的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
#define FRONT true
#define BACK false

using namespace std;

int main() {
string s, fr, ans;
cin >> s;
bool mode = BACK;
for (auto c : s) {
if (c == '[') {
mode = FRONT;
ans = fr + ans;
fr.clear();
}
else if (c == ']') {
mode = BACK;
}
else {
if (mode == BACK) {
ans.push_back(c);
}
else {
fr.push_back(c);
}
}
}
ans = fr + ans;
cout << ans << endl;
return 0;
}

Problem D

题目描述

对于数\(7331\)而言,\(7,73,733,7331\)都是质数,因此\(7331\)被称作长度为\(4\)的特殊质数。

输入为\(N(1 \leq N \leq 8)\),求出所有长度为\(N\)的特殊质数。

题解

实际上可以使用宽搜求解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <queue>
int main() {
int N;
cin >> N;
queue<int> ans({2, 3, 5, 7});
int lastCount = 4;
int curCount = 0;
for (int i = 2; i <= N; i++) {
curCount = 0;
for (int j = 1; j <= lastCount; j++) {
int cur = ans.front();
ans.pop();
cur *= 10;
for (int k = 1; k <= 9; k += 2) {
if (is_prime(cur + k)) {
ans.push(cur + k);
curCount++;
}
}
}
lastCount = curCount;
}
while(!ans.empty()) {
cout << ans.front() << endl;
ans.pop();
}
return 0;
}

Problem E

题目描述

输入一个\(32\)位无符号整数,输出其高\(16\)位与低\(16\)位交换后的结果。

题解

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#define base 65536 //2^16
using namespace std;
int main(){
size_t n;
cin >> n;
size_t low = n / base, high = n % base;
cout << high * base + low << endl;
return 0;
}

Problem F

题目描述

输入两个正整数\(x_0,y_0(2≤x_0≤100000,2≤y_0≤1000000)\),求出满足下列条件的\(P,Q\)的个数:

(1)\(P,Q\)都是正整数;

(2)要求\(P,Q\)\(x_0\)为最大公约数,以\(y_0\)为最小公倍数。

试求满足条件的所有可能的两个正整数的个数。

题解

\(P=k_1x_0, Q=k_2x_0(k_1与k_2互质)\), 则依题意\(k_1k_2x_0=y_0\),也就是说\(k_1k_2=\displaystyle \frac{y_0}{x_0}\)。若\(x_0\)不能整除\(y_0\),则满足要求的个数为0;否则只要统计\(\displaystyle \frac{y_0}{x_0}\)的互质因数的组数即可(也就是所有的非平方根因数的个数)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int gcd(int a, int b) {
return a % b == 0 ? b : gcd(b, a % b);
}
int main() {
int x0, y0;
cin >> x0 >> y0;
if (y0 % x0) {
cout << 0 << endl;
return 0;
}
int p = y0 / x0;
int ans = 0;
for (int i = 1; i * i < p; i++) {
if (p % i == 0 && gcd(i, p / i) == 1) {
ans += 2;
}
}
cout << ans << endl;
return 0;
}

评论