21天好习惯第一期—8

本文介绍了快速幂算法,一种高效的计算大数次幂的方法,其时间复杂度为O(log₂N)。通过两个实例展示了快速幂在基础加法和区间乘积问题中的应用,分别用于求解A+B的模幂和区间乘积的模逆问题。代码实现中涉及到了取模运算和分数取模的技巧,如费马小定律。

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

快速幂

快速幂算法就是快速算底数的n次幂的算法。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

快速幂其实是一个比较固定的一种模板算法,完全可以套用模板。

1.瓜瓜的A+B

这是一道很基本的要用到快速幂的题目。

 AC代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ksm(ll a,ll b,ll p)
{
    ll ans=1;
    a%=p;
    while(b)
    {
        if(b&1) ans=ans*a%p;
        b>>=1;
        a=a*a%p;
    }
    return ans%p;
}
int main()
{  ll n,m,p,t;
  cin>>t;
 while(t--){
     cin>>n>>m>>p;
   cout<<ksm(n+m,p,p)%p<<endl;
  }
}

2.智乃酱的区间乘积

 这道题其实是在快速幂算法的基础上再用到了分数取模——费马小定律 

AC代码如下:

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll mod=1e9+7;
ll k[100002];
ll pow(ll a,ll b)
{ll ans=1;
while(b)
{if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
int main()
{int n,m;
cin>>n>>m;
int x;
k[0]=1;
for(int i=1;i<=n;i++)
{cin>>x;
 k[i]=k[i-1]*x%mod;
}
while(m--)
{int a,b;
cin>>a>>b;
printf("%lld\n",k[b]*pow(k[a-1],mod-2)%mod);
}
return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值