蓝桥杯(数论)练习11.28

本文探讨了作者在使用Python解决堆的计数问题时遇到的超时挑战,强调了数据类型管理和动态规划在Python中的效率问题,并分享了解决费马小定理的思路。同时提及其他算法竞赛中字符串操作和全排列的技巧应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆的计数 - 蓝桥云课 (lanqiao.cn)

        我用python写的费马小定理,呜呜呜,还是超时了,全网没搜到python的解放,真的是很卡速度呀,但是思想还是一样的,弄了好长时间,python的话一定要注意这个数据类型,经常会有小数的出现,而且dp用python真的很慢。 

#2018堆的计数
N = 100010
MOD = 1e9 + 9
n=0
f=[0]*N
s=[0]*N
fact=[0]*N
vv=[0]*N
def fm(x,k):
    # print(x,end=' ')
    # print(k)
    res = 1;
    while (k):
        if (k % 2 == 1) :
            res = int(res)* int(x) % int(MOD)
        x = int(x) * int(x) % int(MOD)
        k=int(k / 2);
    # print(int(res))
    return int(res)
def init():
    fact[0] = vv[0] = 1;
    for i in range(1,n+1) :
        fact[i] = int(fact[i - 1] * i % MOD)
        vv[i] = fm(fact[i], int(MOD - 2));
        #print(fact[i])
def sl(a,b) :
    return int(fact[a] * vv[b] % int(MOD) * int(vv[a - b]) % int(MOD))
if __name__ == '__main__':
    n=int(input())
    init()
    #print(fact)
    # print('***************************************************************************')
    #print(inv)
    lst=[]
    ans=n
    for i in range(n):
        lst.append(ans)
        ans=ans-1
    for i in lst:
        s[i] = 1;
        if (i * 2 <= n) :
            s[i] += int(s[i * 2])
        if (i * 2 + 1 <= n):
            s[i] += int(s[i * 2 + 1])
    for i in lst:
        f[i] = 1;
        if (i * 2 <= n):
            f[i] = int(f[i * 2])
        if (i * 2 + 1 <= n):
            f[i] = int(int(f[i]) * sl(s[i] - 1, s[i * 2]) % int(MOD) * f[i * 2 + 1] % int(MOD))

    print(int(f[1]))
    #385202505

 

带分数 - 蓝桥云课 (lanqiao.cn)

蓝桥杯的数论的基础题目了,简单的就只有这两道,这道就是考的字符串的拼接,字符串的分割以及这个全排列的应用。

from itertools import permutations
for i in permutations('123456789'):
    i=''.join(i)
    print(i)
from itertools import permutations
import math
import time
import os
n=int(input())
ans=0
for i in permutations('123456789'):
    i=''.join(i)
    
    for j in range(len(str(n))):
        a=int(i[:j+1])
        b_temp=(n-a)*int(i[-1])%10#运用了数学知识,取到被除数的最后一位
        if b_temp==0:#如果是0的话不符合条件
            continue
        b_i=i.index(str(b_temp))#找到符合条件的位数
        if b_i<=j or b_i>=8:
            continue
        b = int(i[j+1:b_i+1])#分割被除数
        c = int(i[b_i+1:])#输出
        if a+b/c == n:
            ans+=1
print(ans)

        正好有空就多练习一下,顺便也熟悉python的用法,据小道消息说17周考试,呜呜呜,所以时间更要抓紧了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

钟一淼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值