题目
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如 3/4,1/8,71/43,8/1,1/7, 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1到 2020之间的整数(包括 1和 2020)?
思路
直接对分子分母的公约数进行判断,如其最大公约数为1,则为既约分数。
代码
import os
import sys
import math
# 请在此输入您的代码
count = 0
for i in range(1, 2021):
for j in range(1, 2021):
if math.gcd(i, j) == 1 : # math.gcd() 方法返回给定的整数参数的最大公约数。
count += 1
print(count)
题目
题目描述
小蓝在一个 n 行 m 列的方格图中玩一个游戏。
开始时,小蓝站在方格图的左上角,即第 1行第 1列。
小蓝可以在方格图上走动,走动时,如果当前在第 r 行第 c 列,他不能走到行号比 r 小的行,也不能走到列号比 c 小的列。同时,他一步走的直线距离不超过 3。
例如,如果当前小蓝在第 3 行第 5 列,他下一步可以走到第 3 行第 6 列、第 3 行第 7 列、第 3 行第 8 列、第 4 行第 5 列、第 4 行第 6 列、第 4 行第 7 列、第 5 行第 5 列、第 5 行第 6 列、第 6行第 5 列之一。
小蓝最终要走到第 n 行第 m 列。
在图中,有的位置有奖励,走上去即可获得,有的位置有惩罚,走上去就要接受惩罚。奖励和惩罚最终抽象成一个权值,奖励为正,惩罚为负。
小蓝希望,从第 1 行第 1 列走到第 n 行第 m 列后,总的权值和最大。请问最大是多少?
输入描述
输入的第一行包含两个整数 n,m,表示图的大小。
接下来 n 行,每行 m 个整数,表示方格图中每个点的权值。
其中,1≤n≤100,−10^4≤权值≤10^4。
输出描述
输出一个整数,表示最大权值和。
思路
这个题目跟之前的杨辉三角很相似,也是从某个点出发,到另一个点的最大值。都属于动态规划这一类的问题。发现自己遇见这样的题目,都不会写!呜呜 我只会去找当前可达的局部最大(我是废物)。然后就去学了一下动态规划,学会递归思想。然后就试着写了一下,发现好像是正确的耶!我是能干的小火车!
代码
import os
import sys
# 请在此输入您的代码
n, m = input().split()
data = []
n = int(n)
m = int(m)
# 这里不需要这样转化 使用map函数 n, m = list(map(int, input().split()))
for i in range(n):
data.append(input().split())
offset = [[0, -1], [0, -2], [0, -3], [-1, 0], [-1, -1], [-1, -2], [-2, 0], [-2, -1], [-3, 0]]
mem = {} # 用来记录已经找到的到某点的最大值 字典的key是二维数组投影到list的顺序
def max_data(x, y):
if x*m + y + 1 in mem: # 要是到该点的最大值已经被计算过了 则直接查找 减少计算次数
return mem[x*m + y + 1]
if x == 0 and y == 0: # 递归到起点就不继续往下进行递归了 返回原点的值
return int(data[0][0])
a = []
for i in offset:
if x + i[0] >=0 and y + i[1] >= 0: # 排除掉不合法的邻居 也就是到达矩阵的边界部分
a.append(max_data(x + i[0], y + i[1]))
num = max(a) + int(data[x][y])
mem[x*m + y + 1] = num # 记录到达当前点的最大值
return num
print(max_data(n-1, m-1) )
tips:
使用map函数:
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
data.append(list(map(int, input().split())))