# 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阶乘约数

n

=

p

1

a

1

p

2

a

2

.

.

.

p

k

a

k

n=p_{1} ^{a_{1}}*p_{2} ^{a_{2}}*...*p_{k} ^{a_{k}}

n=p1a1p2a2...pkak

=

(

a

1

+

1

)

(

a

2

+

1

)

.

.

.

(

a

k

+

1

)

=(a1+1)(a2+1)...(ak+1)

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]  # 减去和前面重复的部分
print(sum(dp))
# 3616159



# 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 i in 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

【评测用例规模与约定】

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
【样例说明】

【评测用例规模与约定】

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补给

【问题描述】

【输入格式】

x

i

,

y

i

x_{i},y_{i}

xi,yi，表示编号为i的

(

x

i

x

j

)

2

+

(

y

i

y

j

)

2

sqrt{(x_{i}-x_{j})^{2}+(y_{i}-y_{j})^{2}}

(xixj)2+(yiyj)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):  # 枚举最后从哪个村庄返回起点，也就是最后一个访问的村庄
res = min(res, dp[(1 << n)-1][i]+w[i][0])
print('{:.2f}'.format(res))
# 80%



【问题描述】

【输入格式】

【输出格式】

【样例输入】
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
【评测用例规模与约定】

THE END