快速幂模板(病毒)

快速幂模板(病毒)

快速幂并不陌生,就不多说了,嗯。
直接上题。

题目描述

2015年1月1日,国际卫生组织公布了一种新型病毒CAI,其复制能力极强,会使人的记忆能力严重衰退。

在每 1 秒内,一个病毒会分身出 N 个病毒(本体不计),它们和本体拥有着同样的能力,如果 N=4,在第一秒初有 1 个病毒本体,第一秒末分裂出 4 个,那么第一秒末有 5 个,它们在第二秒末会再分裂 5*4 =20个,那么加上最开始的,第二秒末就有 25 个。

为了抑制这种可怕的病毒,清华大学的医学研究人员经过认真研究这种病毒的基因,发明了一种新型青霉素注射液,能有效的消灭这种病毒。人体只需要注射一次这种青霉素,就可以终身免疫。这种青霉素杀毒的前提是:当病毒的数量必须达到或者超过 P 个(对人体开始有害),药力才会自动发挥作用——瞬间全部消灭 P 个病毒。那么,在第 M 秒末,环境中还有多少病毒呢?(注,第一秒初开始就注射了青霉素)

输入格式

输入数据只有一行,为 3 个整数 N、M 和 P,其含义如题目描述(初始时,只有一只病毒)。

输出格式

输出数据只有一行,为第 M 秒最后剩余的病毒数目。

样例数据 1

输入 
4 3 3
输出
2

样例数据 2

输入 
10000 1000 1
输出
0

备注

【样例1说明】
第一秒的病毒分裂出 4 个,加上本体就是 5 个,消灭三个还剩两个。
第二秒的病毒分裂出 2*4=8 个,加上两个本体就是 10 个,药力发挥 3 次,消灭了 9 个,还剩一个。
第三秒剩下的那个分裂出 4 个,加上本体就是 5 个,药力发挥一次消灭三个,还剩两个。

【样列2说明】
只要有 1 个病毒,药力就发挥杀毒功能,显然没有病毒能活下来。

【数据范围】
对于 1/3 的数据:M≤100000;
对于 2/3 数据:1≤N,P≤230,1≤M≤1152921504606846976;
对于 3/3 数据:1≤N≤230,1≤P≤260,1≤M≤1152921504606846976

其实就是(n+1)^m%p,但n,m,p取值范围都很大,所以用快速幂。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
using namespace std;

long long n,m,p;

inline long long ksc(long long x,long long y)
{
    long long ans=0;
    while(y>0)
    {
        if(y&1)
            ans=(ans+x)%p;   //同样为了节省时间,用了快速乘。
        y=y>>1;
        x=(x+x)%p;
    }
    return ans;
}

inline long long ksm(long long x,long long y)
{
    long long ans=1;       //注意快速幂时,初始化ans为1。
    while(y>0)
    {
        if(y&1)
            ans=ksc(ans,x);
        y=y>>1;
        x=ksc(x,x);
    }
    return ans;
}

int main()
{
    cin>>n>>m>>p;
    cout<<ksm(n+1,m);
    return 0;
}

。。。。。就这样。

——我认为return 0,是一个时代的终结。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 快速是一种用于快速计算运算的算法,其基本思想是将指数进行二进制拆分,然后利用指数的二进制表示来快速计算运算。在计算过程中,可以利用取余运算来避免数值溢出,提高计算效率。快速算法的时间复杂度为O(logn)。 具体实现时,可以使用递归或循环的方式来实现快速算法。在递归实现中,需要注意处理指数为负数的情况。在循环实现中,需要注意处理指数为0的情况。 取余运算可以使用%运算符来实现,其含义是求两个数相除的余数。在快速算法中,取余运算可以避免数值溢出,提高计算效率。需要注意的是,在取余运算中,除数不能为0。 综上所述,快速算法和取余运算是计算运算时常用的算法和运算符,能够提高计算效率,避免数值溢出。 ### 回答2: 快速算法是一种优化指数运算的算法,通常用于对大整数进行多次乘方运算。该算法的基本思想是将指数拆分成二进制的形式,然后利用指数的二进制表示逐步计算。 具体来说,假设要计算a^b mod c的值,其中a、b、c均为正整数,那么可以先将b转换为二进制的形式,然后从右往左遍历这个二进制数,每次将当前位的值乘到结果中,同时对结果取模,然后将底数a自乘一次,且也要对结果取模。最终得到的结果就是a^b mod c的值。 例如,假设要计算3^13 mod 7的值,将13转换为二进制的形式得到1101,从右往左遍历这个二进制数,开始时结果为1,底数为3,当前位是1,那么将3乘到结果中,并对结果取模得到3,底数自乘得到9 mod 7 = 2;下一位是0,直接将底数自乘,即2*2 mod 7 = 4;再下一位是1,将底数自乘得到16 mod 7 = 2,同时将2乘入结果,结果为3×2 mod 7 = 6;最后一位是1,将底数自乘得到4 mod 7 = 4,同时将4乘入结果,结果为6×4 mod 7 = 3,因此3^13 mod 7的值为3。 快速算法的优点是可以快速地计算指数运算,具有较好的时间复杂度。同时,取模运算的存在可以避免产生过多的中间结果,节省了空间复杂度。然而,快速算法的缺点是需要将指数转换为二进制形式,这可能会增加算法的编程难度。 ### 回答3: 快速是一种用于求解运算的快速算法。在进行取余运算时,快速算法能够通过对结果取模,使得计算结果更为精确。在计算大数据的的运算时,常常可以使用快速的算法来进行加速运算。 快速的算法可以使用递归的方式实现,也可以使用循环的方式实现。递归实现的代码比较简单,但是存在栈空间过大的问题;循环实现的代码虽然有一定的难度,但是能够避免栈空间过大的问题。 在进行取余运算时,我们需要注意的是,如果运算的两个数都很大,那么我们在计算结果时需要特别小心。因为如果直接进行计算,可能会导致数据类型溢出,进而产生错误的结果。为了避免这种情况,我们可以在进行计算时,对结果进行取模处理。 在进行取模运算时,我们需要使用取模定理,也就是(a*b)%p=(a%p)*(b%p)%p。通过这种方式,可以使得计算结果更为精确,也可以避免数据类型溢出的情况发生。如果无法使用取模定理,则需要使用高精度的算法进行取余运算。 总而言之,快速算法是一种非常有效的运算算法,可以快速地计算出大数据的运算结果。在进行取余运算时,需要特别注意数据类型溢出的问题,在进行计算时需要特别小心。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值