题目大意
给出等比数列的首项,公比,和项数
给出等比数列前n项的求和公式:
有M个询问,求出等比数列前n项的和
题目解析
快速幂和费马小定理
p=1时,需要特判一下,且相乘前要先取模
因为取模以后不能用除法,所以用乘法逆元来避免除法
即(a/b)%mod ≡ \equiv ≡a*bmod-2%mod(mod为质数 b|a(a整除b))
代码
#include<bits/stdc++.h>
#define M 1000000007
#define LL long long
using namespace std;
LL m,a,q,n,f;
LL qp(LL a,LL b)
{
LL ans=1,base=a%M;
while(b)
{
if(b&1)
ans=ans*base%M;
b>>=1;
base=base*base%M;
}
return ans;
}//快速幂
int main()
{
scanf("%lld",&m);
while(m--)
{
scanf("%lld%lld%lld",&a,&q,&n);
if(q==1)
{
printf("%lld\n",a*(n%M)%M);
continue;
}
f=qp(q-1,M-2)%M;//求出b=(q-1)^M-2%M ,费马小定理
a=(a*(qp(q,n)-1))%M;
printf("%lld\n",a*f%M);
}
}