模板 2018-01-17 快速幂 快速乘

快速幂太常用了, 单开一篇.

举例!

2^100  %100

4^50  %100

16^25  %100

16^24 *16  %100

256^12 *16  %100

(256%100)^12 *16  %100

56^12 *16  %100

3136^6 *16  %100

(3136%100)^6 *16  %100

36^6 *16  %100

1296^3 *16  %100

(1296%100)^3 *16  %100

96^3 *16  %100

96^2 *16*96  %100

9216^1 *1536  %100

(9216%100)^1 *(1536%100)  %100

16^1 *36  %100

576%100

76

大概是这么个样子.(蒙混过关的原因是刚刚举例全部打错了, 不打啦!)

应用的原理是, 如果我想计算两个数的积之后取模的结果, 可以分别把两个数取模再相乘

同理我想计算一百万个数的积(就是幂嘛), 我可以把这一百万个数都取个余然后再乘.

关于如何降次,上面有举例的.

模板如下:

long long int quick_pow(long long int a,long long int p,long long int mod)
{//计算(a^p)%mod
    long long int res=1;
    a=a%mod;
    while(p)
    {
        if(p&1)
            res=res*a%mod;
        p>>=1;
        a=(a*a)%mod;
    }
    return res;
}

还有一个东西,叫做快速乘

原理很像的.

模板如下

long long int quick_multi(long long int a,long long int p,long long int mod)
{//计算(a*p)%mod
    long long int res=0;
    a=a%mod;
    p=p%mod;
    while(p)
    {
        if(p&1)
            res=(res+a)%mod;
        p>>=1;
        a=(a+a)%mod;
    }
    return res;
}
好有愧疚感啊, 这么点东西都能水一篇.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值