资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
将一个数N分为多个正整数之和,即N=a1+a2+a3+…+ak,定义M=a1*a2*a3*…*ak为N的潜能。
给定N,求它的潜能M。
由于M可能过大,只需求M对5218取模的余数。
输入格式
输入共一行,为一个正整数N。
输出格式
输出共一行,为N的潜能M对5218取模的余数。
样例输入
10
样例输出
36
数据规模和约定
1<=N<10^18
while循环中的第2/3/4/5个elif处理需要格外注意:
目的是先减掉高位的数,比如先减掉 10**16-1 的位数,M乘上10**16-1的潜能就可以了,后边同理。
1.操作减掉的数必须是3的整数倍,否则此处减掉的数中包含2,如果末尾剩余的数不是3的整数倍,则还会分解出2,此时2就多了。
2.注意判断条件数要比操作数至少大2,为了放置边界问题,比如此处是10000,大于9999,减掉9999的话剩1,不符合条件,所以至少要判断大于10000时才能减掉9999。
n = int(input())
m = 1
while n != 0:
if n == 1: # 处理特殊情况
break
elif n == 2 or n == 4: # 处理末尾剩余的数字
m = (m * 2) % 5218
n -= 2
# 从此处开始向下的4个elif需要格外注意,此处的作用是为了处理位数过高时的情况
# 1.操作减掉的数必须是3的整数倍,否则此处减掉的数中包含2,如果末尾剩余的数不是3的整数倍,则还会分解出2,此时2就多了
# 2.注意判断条件数要比操作数至少大2,为了放置边界问题,比如此处是10000,大于9999,减掉9999的话剩1,不符合条件,所以至少要判断大于10000时才能减掉9999
elif n > 10 ** 16:
m = (m * 3347) % 5218
n -= 10 ** 16 - 1
elif n > 10 ** 12:
m = (m * 553) % 5218
n -= 10 ** 12 - 1
elif n > 10 ** 8:
m = (m * 3723) % 5218
n -= 10 ** 8 - 1
elif n > 10 ** 4:
m = (m * 3727) % 5218
n -= 10 ** 4 - 1
else: # 不到1004的处理
m = (m * 3) % 5218
n -= 3
print(m)