JZOJ Day 3-B组-T1——学习神技

题目大意:

已知:一个等比数列共有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 = 1qA1×(1qn)  (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×qS=A1×qn+1A1
因式分解得:
S × ( q − 1 ) = A 1 × ( q n + 1 − 1 ) S\times (q-1)=A_1\times (q^{n+1}-1) S×(q1)=A1×(qn+11)
移项得:
S n   =   A 1 × ( q n − 1 ) q − 1 S_n\ =\ \frac {A_1\times(q^n-1)}{q-1} Sn = q1A1×(qn1)
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} q1A1×(qn1) = 1qA1×(1qn)
证毕。

那啥,上面的证明应该是① − - ②但是我懒得改了
所以在后面我就加上了① − - = = = − - ①的证明
然后正题来了:
快速幂求乘法逆元随便搞

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;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值