快速幂算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、快速幂代码

long long fastpower(long long base,long long power){
    long long int ans=1;
    while(power>0){
        if(power&1)
            ans=(ans*base)%p;
        power>>=1;
        base=(base*base)%p;
    }
    return ans;
}

二、例题及代码

1.P1226 【模板】快速幂

代码如下(示例):        

#include <bits/stdc++.h>
using namespace std;
long long int a,b,p;
long long fastpower(long long base,long long power){
    long long int ans=1;
    while(power>0){
        if(power&1)
            ans=(ans*base)%p;
        power>>=1;
        base=(base*base)%p;
    }
    return ans;
}
int main(){
    cin>>a>>b>>p;
    printf("%ld^%ld mod %ld=%ld",a,b,p,fastpower(a,b));
    return 0;
}

2.P3197 [HNOI2008] 越狱

思路:

首先,第一种思路肯定是搞一个公式可以直接算出有相邻两个人信仰相同的情况数,but。。。没有万能公式啊!!!

然后换一种思路。

我们可以倒过来想,我们只需要算出不越狱的情况,再用总情况减掉就行了!!!

所以。。。第一个人有m种选择,第二个人为了不与第一个人不重复,只有m-1个选择,第三个人为了不与第二个人重复,也只有m-1个选择。。。那么,最后的公式。。。

                ​​​​​​​        ​​​​​​​        ans=m^n-m*(m-1)^{n-1}

代码如下(示例):

#include <bits/stdc++.h>
using namespace std;
const int p=100003;
long long int a,b;
long long fastpower(long long base,long long power){
    long long int ans=1;
    while(power>0){
        if(power&1)
            ans=(ans*base)%p;
        power>>=1;
        base=(base*base)%p;
    }
    return ans;
}
long long int sum,s;
int main(){
    cin>>a>>b;
    sum=fastpower(a,b);
    s=(a*fastpower(a-1,b-1))%p;
    printf("%d\n",(sum+p-s)%p);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值