2019 计蒜之道 初赛 第三场 阿里巴巴协助征战SARS(python做法,费马小定理+快速幂)

这篇博客探讨了如何利用费马小定理和快速幂算法来计算满足特定条件的SARS病毒DNA序列的数量。在DNA字符串仅由A、T、C、G组成,且A和C出现偶数次的情况下,文章提供了一个Python解决方案,计算这些字符串的个数对10^9 + 7取模的结果。

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

目前,SARS 病毒的研究在世界范围内进行,经科学家研究发现,该病毒及其变种的 DNA 的一条单链中,胞嘧啶、腺嘧啶均是成对出现的。这虽然是一个重大发现,但还不是该病毒的最主要特征,因为这个特征实在太弱了。

为了进一步搞清楚该病毒的特征,CN 疾病控制中心和阿里巴巴集团合作,用科技的力量和程序的思维来解决这个难题。现阿里巴巴特委派你成为 CN 疾病控制中心的 SARS 高级研究员,去研究在这个特征下,可能成为 SARS 病毒的 DNA 序列的个数。更精确地说,你需要统计所有满足下列条件的长度为 nn 的字符串的个数:

  1. 字符串仅由 A、T、C、G 组成
  2. A 出现偶数次(也可以不出现)
  3. C 出现偶数次(也可以不出现)

当 n=2n=2 时,所有满足条件的字符串有如下 66个:

TT,TG,GT,GG,AA,CC。

注: 由于这个数可能非常庞大,你只需给出对 10^9 + 7109+7 取模的结果即可。

输入格式

输入文件给出了若干个 nn。最后以数字 00 结束。

输出格式

对于输入文件中的每一个 nn,输出满足条件的字符串的个数对 10^9 + 7109+7 取模的结果。

数据范围

n \le 10^{(10^5)}n≤10(105)

样例输入复制

1
2
3
100
0

样例输出复制

2
6
20
113046907

题目思路:先搜索枚举出前几项找规律,最后发现规律是2^n-1+4^n-1,然后用费马小定理求出幂的余数,再用快速幂求解即可,python做法如下

global mod
mod = 1000000007
def mi(n,b):  #快速幂
    x=n
    ans=1
    while b:
        if b%2==1:
            ans*=x%mod
        x=(x%mod*x%mod)%mod
        b=b>>1
    return ans
while(1):
    a=input()
    if a=='0':
        break
    sum=0
    for i in a:
        sum=sum*10+int(i)
        if(sum>mod-1):            #费小马定理
            sum=sum%(mod-1)
    sum=sum-1
    print((mi(2,sum)%mod+mi(4,sum)%mod)%mod)

 

<think>嗯,用户想了解如何用费马小定理来简化模幂运算。首先,我需要回忆一下费马小定理的内容。定理说的是如果p是质数,且a和p互质,那么a的(p-1)次方模p等于1,也就是$a^{p-1} \equiv 1 \mod p$。这个定理在模运算里很有用,尤其是处理大指数的时候。 那用户的问题是如何利用这个定理来简化模幂运算。比如,算a的e次方模p,当e很大的时候,直接算会很麻烦。这时候费马小定理可以用来将指数减小。比如,如果p是质数,a和p互质,那么可以把e写成k*(p-1)加上余数r,这样$a^e \mod p$就可以变成$a^{k*(p-1) + r} \mod p$,也就是$(a^{p-1})^k * a^r \mod p$。根据定理,a的(p-1)次方模p是1,所以整个式子可以简化为$a^r \mod p$,这样就只需要算r次方的模,r是e对(p-1)取模的结果。 接下来需要确认的是这个方法的应用条件。首先,p必须是质数,其次a和p必须互质。如果这两个条件不满足,费马小定理就不能直接应用。比如,如果p不是质数,可能需要用欧拉定理,这时候指数模的是欧拉函数φ(p)的值,但用户的问题里没有提到这个,所以可能不需要展开。 然后要考虑例子,比如算3^100模7。7是质数,3和7互质,所以根据费马小定理,指数可以模6(因为7-1=6)。100除以6余4,所以结果是3^4 mod7,也就是81 mod7等于4。这个例子能清楚展示步骤。 另外,可能用户会问到当指数小于p-1的时候是否需要处理,这时候可能不需要简化,但也可以应用,比如指数是5,p是7,那么余数还是5,结果不变。但需要指出这个方法在指数大于等于p-1时更有效。 还有,应用中的注意事项,比如p必须是质数,否则不能直接用费马小定理。如果a和p不互质,比如a是p的倍数,那么结果会是0,这时候定理不适用,但算起来更简单。比如5^10 mod5直接是0,不需要用定理。 然后需要整理步骤,可能分成几个方法:直接应用费马小定理,处理非互质情况,以及综合运用其他定理如欧拉定理。每个步骤给出例子,并注意格式中的数学符号要用$符号包裹。 最后,生成相关问题的时候,需要考虑用户可能进一步的问题,比如处理合数模数的情况,或者与其他定理结合使用,或者实际应用中的例子,以及错误处理的情况。比如,如果用户尝试用费马小定理但p不是质数,会发生什么,这时候需要欧拉定理,或者如何判断是否互质等等。</think>费马小定理在模幂运算中的应用可通过以下方法实现: **定理核心条件** 当模数$p$为质数且底数$a$与$p$互质时,定理成立:$$a^{p-1} \equiv 1 \mod p$$ 此时可将指数$e$转换为$k(p-1)+r$形式,其中$r = e \mod (p-1)$ **简化步骤** 将原式$a^e \mod p$转化为: $$a^{e} \equiv a^{k(p-1)+r} \equiv (a^{p-1})^k \cdot a^r \equiv 1^k \cdot a^r \equiv a^r \mod p$$ **算示例** 算$3^{100} \mod 7$: 1. 验证条件:$7$是质数,$\gcd(3,7)=1$ 2. 算指数余数:$100 \mod 6 = 4$(因$7-1=6$) 3. 简化算:$3^4 = 81 \equiv 81-11×7=4 \mod 7$ **非互质情况处理** 当$a$与$p$不互质时(即$a$是$p$的倍数): $$a^e \equiv 0 \mod p$$ 例如$5^{10} \mod 5$直接等于$0$ **扩展应用** 结合欧拉定理可处理合数模数$n$: $$a^{\varphi(n)} \equiv 1 \mod n$$ 其中$\varphi(n)$是欧拉函数,当$n$为质数时退化为费马小定理 **验证代码** ```python def mod_exp(a, e, p): if a % p == 0: return 0 reduced_e = e % (p-1) return pow(a, reduced_e, p) # 示例算 print(mod_exp(3, 100, 7)) # 输出4 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值