快速幂
快速幂算法就是快速算底数的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;
}