import typing


def factors(number: int) -> typing.List[int]:
    """
    列出 number 的所有质因数, 时间复杂度O(logn)

    例如:
    10 = [1, 2, 5, 10]
    16 = [1, 2, 4, 8, 16]

    算法(以10为例):
    1 x 10 = 10         # [1, 10]
    2 x  5 = 10         # [1, 10, 2, 5]
                        # [1, 2, 5, 10]         排序后

    算法(以16为例):
    1 x 16 = 16         # [1, 16]
    2 x  8 = 16         # [1, 16, 2, 8]
    4 x  4 = 16         # [1, 16, 2, 8, 4]
                        # [1, 2, 4, 8, 16]      排序后
    """
    if number < 2: return []
    result: typing.List[int] = [1, number]                     # 头加1

    i = 2
    while (i * i) < number:                                    # 平方
        if (number % i) == 0:
            result.append(i)                                   # number 能被 i 整除, 所以 i 是 number 的质因数(factors).
            result.append(number//i)
        i += 1

    if (i * i) == number: result.append(i)                     # 尾加自己
    return sorted(result)