题目大意:
题目链接:https://jzoj.net/senior/#main/show/4229
求首项为,公比为,项数为的等比数列的和。
思路:
众所周知,项的等比数列和的公式是
证明:
若这个等比数列为
设
则
相减得
简化得
移向得
证毕。
利用快速幂计算,再用逆元求答案即可。
代码:
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll MOD=1000000007ll;
int T;
ll n,q,a,k,Read,ans;
char ch;
ll read()
{
Read=0;
ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9')
Read=(Read<<3)+(Read<<1)+ch-48,ch=getchar();
return Read;
}
void write(ll x)
{
if (x>9) write(x/10);
putchar(x%10+48);
}
ll power(ll x,ll m) //快速幂
{
ll ans=1;
while (m)
{
if (m&1) ans=ans*x%MOD;
x=x*x%MOD;
m>>=1;
}
return ans;
}
int main()
{
T=read();
while (T--)
{
a=read(),q=read(),n=read();
if (q==1) write(a*(n%MOD)%MOD); //特判
else
{
k=power((q-1)%MOD,MOD-2); //求逆元
ans=a%MOD*(power(q%MOD,n)-1)%MOD*k%MOD;
write(ans);
}
putchar(10);
}
return 0;
}