题目大意:
已知:一个等比数列共有n项,第一项为
A
1
A_1
A1,公比为q
求:
S
n
=
A
1
×
(
1
−
q
n
)
1
−
q
(
q
≠
1
)
o
r
A
1
×
n
(
q
=
1
)
S_n\ =\ \frac {A_1\times(1-q^n)}{1-q}\ \ (q\neq 1) \ or\ A_1 \times n\ \ (q = 1)
Sn = 1−qA1×(1−qn) (q̸=1) or A1×n (q=1)
解题思路:
等比数列求和公式
q
≠
1
q \neq 1
q̸=1的情况证明:
证:
设
S
=
A
1
+
A
1
×
q
+
A
1
×
q
2
+
.
.
.
+
A
1
×
q
n
S=A_1+A_1\times q+A_1\times q^2+...\ +A_1\times q^n
S=A1+A1×q+A1×q2+... +A1×qn ①
两边同乘
q
q
q,得
S
×
q
=
A
1
×
q
+
A
1
×
q
2
+
A
1
×
q
3
.
.
.
+
A
1
×
q
n
+
1
S\times q=A_1\times q+A_1\times q^2+A_1\times q^3...\ +A_1\times q^{n+1}
S×q=A1×q+A1×q2+A1×q3... +A1×qn+1 ②
用②
−
-
−①得:
S
×
q
−
S
=
A
1
×
q
n
+
1
−
A
1
S\times q-S=A_1\times q^{n+1}-A_1
S×q−S=A1×qn+1−A1
因式分解得:
S
×
(
q
−
1
)
=
A
1
×
(
q
n
+
1
−
1
)
S\times (q-1)=A_1\times (q^{n+1}-1)
S×(q−1)=A1×(qn+1−1)
移项得:
S
n
=
A
1
×
(
q
n
−
1
)
q
−
1
S_n\ =\ \frac {A_1\times(q^n-1)}{q-1}
Sn = q−1A1×(qn−1)
∵
q
≠
1
q\neq 1
q̸=1且
q
>
1
q > 1
q>1
所以我们就有:
A
1
×
(
q
n
−
1
)
q
−
1
=
A
1
×
(
1
−
q
n
)
1
−
q
\frac {A_1\times(q^n-1)}{q-1}\ =\ \frac {A_1\times(1-q^n)}{1-q}
q−1A1×(qn−1) = 1−qA1×(1−qn)
证毕。
那啥,上面的证明应该是①
−
-
−②但是我懒得改了
所以在后面我就加上了①
−
-
−②
=
=
=②
−
-
−①的证明
然后正题来了:
快速幂求乘法逆元随便搞
A c c e p t e d c o d e Accepted\ code Accepted code:
#include<cstdio>
#include<iostream>
#define int long long
using namespace std;
const int Mod = 1e9+7;
int A, Q, N, mod;
inline int read() {
int f = 0; char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) f = (f<<1) + (f<<3) + c - 48, c = getchar();
return f;
}
int ksm(int a, int M) {
int ans = 1; a %= Mod;
while (M) {
if (M & 1) ans = (ans * a) % Mod;
a = (a * a) % Mod;
M >>= 1;
}
return ans;
}
void write(int x) {
if (x > 9) write(x/10); putchar(x%10+48); return;
}
void writeln(int x) {
if (x < 0) x = -x, putchar('-'); write(x); putchar(10); return;
}
signed main() {
int T = read();
for (;T--;) {
A = read(), Q = read(), N = read();
if (Q == 1) {
writeln((A * (N % Mod)) % Mod);
} else {
mod = ksm(1 - Q, Mod-2);
writeln(A * (1 - ksm(Q, N)) % Mod * mod % Mod);
}
}
return 0;
}