传送门:https://www.cometoj.com/contest/52
A:签到题
题意:多次询问,每次询问给出一个值域区间[l,r],从这区间范围中选出两个整数(可重复),依次求出这俩数的“最大的最小公倍数”、“最小的最小公倍数”、“最大的最大公约数”、最小的最大公约数。
分析:(1)显然,当区间长度为1时,该问题的答案只能是区间中仅有的那个数。
(2)当区间的长度大于1时,最大的最小公倍数,lcmmax =lcm(ar,ar-1) = ar * ar-1;
最小的最小公倍数,lcmmin = lcm(al,al) = al;
最大的最大公约数,gcdmax = gcd(ar,ar) = ar;
最小的最大公约数,gcdmin = gcd(ar,ar-1) = 1;
1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 int main() {
6 int t;
7 scanf("%d",&t);
8 while (t--) {
9 int l,r;
10 scanf("%d%d",&l,&r);
11
12 if (l == r) {
13 printf("%d %d %d %d\n",l,l,l,l);
14 } else {
15 printf("%lld %d %d %d\n",(long long)r*(r-1),l,r,1);
16 }
17 }
18
19 return 0;
20 }
B:麻将题
题意:4个人(编号为1~4)围成一个环,相邻两人可以交换位置。现按逆时针顺序给出环上的编号,代表4人在桌上的位置关系。求最少需要交换多少次位置才能满足1的下一个元素是2,2的下一个元素是3,3的下一个元素是4,4的下一个元素是1。
分析:由于环上只有4个元素,交换次数最多不会超过2次,因此我们可以考虑直接枚举情况。
(1)假如这个序列一开始就满足条件,最少交换次数为 0。
(2)假如这个序列的位置关系为(1,4,3,2),最少交换次数为 2。
(3)其余情况最少交换次数均为 1。

1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 int main() {
6 int num[4],pos = 0;
7 for (int i=0;i<4;i++) {
8 scanf("%d",&num[i]);
9 if (num[i] == 1)
10 pos = i;
11 }
12
13 int arr[4];
14 int pick[4] = {1,4,3,2};
15 bool two = true;
16 for (int i = 0;i<4;i++) {
17 arr[i] = num[pos];
18 pos = (pos + 1)%4;
19 if (arr[i] != pick[i]) {
20 two = false;
21 }
22 }
23
24 if (two) {
25 puts("2");
26 } else {
27 int i = 1;
28 for (;i<4;i++) {
29 if (arr[i] != arr[i-1] + 1) {
30 break;
31 }
32 }
33 if (i == 4) {
34 puts("0");
35 } else {
36 puts("1");
37 }
38 }
39
40 return 0;
41 }
- Analysis: as the ring only four elements, most frequently exchange of not more than 2 times, so we can consider direct enumeration. (1) if the sequence start meet the conditions, minimum switching frequency is 0. (2) if the position relationship between the sequence of (1,4,3,2), with a minimum of 2 switching frequency. (3) the rest of the case at least exchange number 1.
