<>A美丽的2

res = 0 for i in range(1, 2021): if '2' in str(i): res += 1 print(res) # 563
<>B合数个数

def check(n): for i in range(2, n): if n % i == 0: return True return False res
= 0 for i in range(1, 2021): if check(i): res += 1 print(res) # 1713
<>C阶乘约数

^{a_{1}}*p_{2} ^{a_{2}}*...*p_{k} ^{a_{k}}n=p1a1​​∗p2a2​​∗...∗pkak​​

from math import * def isPrime(n): for i in range(2, floor(sqrt(n))+1): if n %
i== 0: return False return True fac = {} n = 100 for i in range(2, n+1): tmp =
i num= 2 while tmp > 1: while tmp % num == 0: fac[num] = fac.get(num, 0) + 1 tmp
//= num num += 1 while not isPrime(num): num += 1 res = 1 for key, value in list
(fac.items()): res *= value+1 print(res) # 39001250856960000
<>D本质上升序列

s =
"tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl"
dp= [1]*len(s) # dp[i]表示以第i个字符结尾的子序列的个数 for i in range(1, len(s)): for j in
range(i): if s[i] > s[j]: dp[i] += dp[j] if s[i] == s[j]: dp[i] -= dp[j] #

<>E玩具蛇

def dfs(x, y, current): global res if current > 16: res += 1 return for i in
range(4): tx, ty = x+dx[i], y+dy[i] if 0 <= tx < 4 and 0 <= ty < 4 and graph[tx]
[ty] == 0: graph[tx][ty] = current dfs(tx, ty, current+1) graph[tx][ty] = 0 res
= 0 graph = [[0]*4 for _ in range(4)] dx = [0, 0, 1, -1] dy = [1, -1, 0, 0] for
iin range(4): for j in range(4): graph[i][j] = 1 dfs(i, j, 2) graph[i][j] = 0
print(res) # 552
<>F天干地支

【问题描述】

（wù）、己（jǐ）、庚（gēng）、辛（xīn）、壬（rén）、癸（guǐ）。

【输入格式】

【输出格式】

【样例输入】
2020
【样例输出】
gengzi
【评测用例规模与约定】

（年份- 3）%10对天干：如1894-3=1891 ，1891除以10余数是1即为甲；
（年份- 3）%12对地支：如1894-3=1891 ，1891除以12余数是7即为午，即1894年是甲午年。

year = int(input()) tiangan = ['jia', 'yi', 'bing', 'ding', 'wu', 'ji', 'geng',
'xin', 'ren', 'gui'] dizhi = ['zi', 'chou', 'yin', 'mao', 'chen', 'si', 'wu',
'wei', 'shen', 'you', 'xu', 'hai'] table = ['']*60 table[40] = tiangan[6]+dizhi[
0] # 公元40年是庚子年，依据这个建表，并且庚和子的下标分别是6和0 i, j = 7, 1 cnt = 41 while cnt != 40: table
[cnt] = tiangan[i]+dizhi[j] i = (i+1) % 10 j = (j+1) % 12 cnt = (cnt+1) % 60
print(table[year % 60]) # 100%
<>G重复字符串

【问题描述】

【输入格式】

【输出格式】

【样例输入】
2
aabbaa

【样例输出】
2

【评测用例规模与约定】

m-1）都取出现次数最多的字符作为要变成的字符，将每一段的对应位置的字符都变成这个字符就行了，因为这个字符在该位置出现最多，其他字符变到该字符能保证次数最少，如果要是变成别的字符，那么出现次数最多的字符变动次数会很多，并非最优解。累加每个位置（0
~ m-1）上变换次数就是答案。
k = int(input()) s = input() if k > len(s): print(-1) else: res = 0 length =
len(s)//k for i in range(length): dic = {} for j in range(k): word = s[j*length+
i] dic[word] = dic.get(word, 0)+1 d = list(dic.items()) d.sort(key=lambda x: x[1
], reverse=True) res += k-d[0][1] print(res) # 100%
<>H答疑

【问题描述】

20 秒或 30 秒，即 ei 取值为 10000，20000 或 30000。

【输入格式】

【输出格式】

【样例输入】
3
10000 10000 10000
20000 50000 20000
30000 20000 30000
【样例输出】
280000
【样例说明】

【评测用例规模与约定】

30000}，即 ei 一定是 10000、20000、30000 之一。

from functools import cmp_to_key def cmp(a, b): ta = a[0]+a[1]+sum(a)+b[0]+b[1]
# a在b前面，两人用的总时间 tb = b[0]+b[1]+sum(b)+a[0]+a[1] # b在a前面，两人用的总时间 return ta-tb n =
int(input()) time = [] for _ in range(n): time.append(list(map(int, input().
split()))) time.sort(key=cmp_to_key(cmp)) res = 0 clock = 0 for s, a, e in time:
clock+= s+a res += clock clock += e print(res) # 100%
<>I补给

【问题描述】

D。每个直升机场都有加油站，可以给直升机加满油。每个月，小蓝都是从总部出发，给各个村庄运送完物资后回到总部。如果方便，小蓝中途也可以经过总部来加油。

【输入格式】

\sqrt{(x_{i}-x_{j})^{2}+(y_{i}-y_{j})^{2}}(xi​−xj​)2+(yi​−yj​)2 ​。

【输出格式】

【样例输入】
4 10
1 1
5 5
1 5
5 1
【样例输出】
16.00
【样例说明】

【样例输入】
4 6
1 1
4 5
8 5
11 1
【样例输出】
28.00
【样例说明】

【评测用例规模与约定】

from math import * def getDistance(x, y): return sqrt(pow(location[x][0]-
location[y][0], 2)+pow(location[x][1]-location[y][1], 2)) n, d = map(int, input(
).split()) location = [tuple(map(int, input().split())) for _ in range(n)] w = [
[float('inf')]*n for _ in range(n)] # w[i][j]表示i号村庄和j号村庄之间的最短距离 # 建立邻接矩阵 for i
in range(n): for j in range(n): dis = getDistance(i, j) if dis <= d: w[i][j] =
dis# Floyd算法 for k in range(n): for i in range(n): for j in range(n): w[i][j] =
min(w[i][j], w[i][k]+w[k][j]) # dp[i][j]表示在状态i下，从0号村庄到j号村庄的最短录 dp = [[float(
'inf')]*n for _ in range(1 << n)] dp[1][0] = 0 for i in range(1, 1 << n): # 枚举状态
for j in range(n): # 枚举村庄 if i >> j & 1 == 1: # 如果j号村庄状态为1 for k in range(n): if
(i-(1 << j)) >> k & 1: # 如果除了j号剩下的村庄中状态为1 dp[i][j] = min(dp[i][j], dp[i - (1 <<
j)][k]+w[k][j]) res = float('inf') for i in range(n): #

'{:.2f}'.format(res)) # 80%
<>J蓝跳跳

【问题描述】

k 且和是 L。这样走一趟就会出来一列数。如果两列数的长度不同，或者两列数中存在一个位置数值不同，就认为是不同的方案。

【输入格式】

【输出格式】

【样例输入】
3 2 5
【样例输出】
9
【样例说明】

1+1+1+1+1
1+1+1+2
1+1+2+1
1+2+1+1
2+1+1+1
2+1+2
1+1+3
1+3+1
3+1+1
【样例输入】
5 3 10
【样例输出】
397
【评测用例规模与约定】