题目链接:https://www.luogu.com.cn/contest/321016#problems

和平干饭日

思路

就是看有多少天吐出的猫粮数 mod 26可以等于0。这里使用了字符串拼接的方式来计算每天吐出的猫粮数

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
sys.set_int_max_str_digits(100000)
#跑代码的时候出现了整数转字符串长度限制,这个是3.11出现的,考场上用的版本并没有这个限制,前两行可以不写

total=1
cnt=0

for i in range(2,2027):
total=str(total)
total=total+str(i)
total=int(total)
if total%26==0:
cnt+=1

print(cnt)

答案:76

干涉条纹

思路

在考场上写出了时间复杂度n^2的代码,跑到考试结束也没出结果(笑)

这题应该是枚举平方数S,然后对每个 S 去找有多少个 (a,b) 满足 a+b=S

找两个较小的数字推一下,不难看出:

1
2
3
当0 ≤ S ≤ B:个数 = S+1
当B < S ≤ A:个数 = B+1
当A < S ≤ A+B:个数 = A+B−S+1

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import math

M1 = 20269876543210
M2 = 20260123456789
total_max = M1 + M2

k_min = 0
k_max = int(math.isqrt(total_max))

ans = 0

for k in range(k_min, k_max + 1):
S = k * k
if S <= M2:
cnt = S + 1
elif S <= M1:
cnt = M2 + 1

else:
cnt = M1 + M2 - S + 1

ans=(ans+cnt)%998244353
print(ans)

答案:315082704

定制展示盘

思路

本质上是一个判断质数,如果是质数就+1变成合数,不是质数直接输出n

注意,n<3的时候不能+1,要输出4(疑似考场上因为这个丢分了(说疑似是因为不知道有没有这个测试点,但考场上确实没写))

代码

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
import sys
import math
input=lambda:sys.stdin.readline().strip()

def isPrime(n):
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for i in range(3, int(math.sqrt(n)) + 1, 2):
if n % i == 0:
return False
return True

T=int(input())
for _ in range(T):
n=int(input())
if n<=3:
print("4")
elif isPrime(n):
print(n+1)
else:
print(n)

奇偶博弈

思路

考前n天练过一次博弈论,导致考场看见题没太蒙,但同时导致了审题不认真丢分。学长押题压得准,学长教得好,我没学好我罪该万死。(可惜,这个题分拿全应该就省一了)

本质上就是看操作数

操作数统计方式如下:

替换操作的奇偶性限制

如果W[i]是奇数(非1),变成0需要两步,偶数(非0)则是1步;如果是1操作数算1,0就是0

按这个方式统计操作数,是奇数就是先手赢,偶数后手赢

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
input = lambda: sys.stdin.readline().strip()

T = int(input())
for _ in range(T):
N = int(input())
W = list(map(int, input().split()))
cnt=0
for i in range(N):
if W[i]%2==0:
if W[i]==0:
cnt+=0
else:
cnt+=1
else:
if W[i]==1:
cnt+=1
else:
cnt+=2
if cnt%2==0:
print("Q")
else:
print("L")