题目大意
约定数位均相同的数字为好数,如222222,555555等求解最小是
1
≤
n
≤
1
0
11
1\leq n\leq10^{11}
1≤n≤1011的倍数的好数,
答案对998244353取模。
题解
直接上代码~~
n=int(input())
mod=998244353
def func(n):
ends=int(4300)
for i in range(1, ends+1):
for t in range(1, 9+1):
num = int(str(t) * i)
if num % n == 0:
return num%mod
return -1
print(func(n))
题解分析
- 这是一个Python组的题目,可以用Python的str和int的特性和转化方法枚举每一个好数对n取模看结果是不是为0。
- 由于要求最小的好数,所以,枚举也要注意从小到大,由于Python的str和int转化位数限制为4300位所以枚举好数的范围是 [ 1 , 1 0 4301 − 1 ] [1,10^{4301}-1] [1,104301−1]。
- 这个范围已经特别大了,如果这个范围内还没找到好数,就返回-1。
- 这个范围内还没找到好数的情况下,在这个范围之外还存在好数的情况很小。所以预计得分可以85%以上。
- 这个代码的时间复杂度仅为 O ( 4300 ∗ 9 ) O(4300*9) O(4300∗9),特别快,不会出现超时的情况
注:有数论的方法可以做出来100%,但是很难分析。我讲的是侧重于多拿分拿好分,在没有数论基础和算法基础的情况下也能简化问题,尽量拿分的方法。