蓝桥杯 算法训练 数的潜能(Python)

资源限制

内存限制: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)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&&CQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值