Codeforces 1355A - Sequence wit
2020-06-16 本文已影响0人
费城的二鹏

日常一道算法题。

翻译
序列与位
定义以下循环:
a[n+1] = a[n] + minDigit(a[n]) * maxDigit(a[n])
这里最大位和最小位就是字面意思,所有位中最大位和最小位的值。
你的任务就是根据给的 a[1] 和 K 计算出 a[K]。
输入格式
输入整数 t 表示测试用例组数。
每个测试用例,输入单行两个数字 a[1] K 用空格分隔
输出格式
每行输出 a[K]。
分析
想了半天,以为是什么数论的知识,结果也没找到规律。
突然灵感一动想到了,如果最低位是0,那么无论 K 剩余多少,就是当前数字了。但是多少次计算后,会是 0,我没有证明。
也就是依据输入值循环计算,当最低位是 0 时,直接输出答案即可。
代码(Python3)

# https://codeforces.com/problemset/problem/1355/A
import sys
import os
import heapq
import math
try:
path = "./file/input.txt"
if os.path.exists(path):
sys.stdin = open(path, 'r')
# sys.stdout = open(r"./file/output.txt", 'w')
except:
pass
t = int(input())
def printd(value):
# print(value)
pass
def case():
arr = list(map(int, input().split(" ")))
a, k = arr[0], arr[1]
for index in range(k - 1):
mindigit = 9
maxdigit = 0
number = a
while number > 0:
digit = number % 10
number //= 10
maxdigit = max(maxdigit, digit)
mindigit = min(mindigit, digit)
if mindigit == 0:
break
a += maxdigit * mindigit
print(a)
for _ in range(t):
case()
更多代码尽在 https://github.com/Tconan99/Codeforces
by 费城的二鹏 2020.06.14 长春