T1:算术计算
\(T\) 组数据,每组数据给出 \(n, a, p\),求 \(\sum\limits_{i=1}^n ia^i\) 对 \(p\) 取模的值。
部分分
直接暴力求和可以拿到 \(15\) 分
另外 \(10\%\) 的数据 \(a = 1\),不难通过数据计算得到答案为 \(\frac{n(n+1)}{2}\)
另外 \(15\%\) 的数据满足 \(1 \leqslant n \leqslant 10^6\),所有问题 \(a, p\) 都相同,可以先把 \(n \leqslant 10^6\) 的结果全部计算出来,存到数组里面,询问的时候直接查表
数学方法
不难通过计算得到最后的答案为 \(\frac{a(1-a^n)}{(1-a)^2} - \frac{na^{n+1}}{1-a}\)
由于分母部分出现了 \(1-a\),因此当 \(\gcd(p, 1-a) = 1\) 的时候存在 \(1-a\) 的逆元,此时可以使用公式求解
可以得到 \(p\) 是一个质数的 \(30\) 分
分治法
先考虑用递归分治求 \(a^n\),令 \(k = \lfloor\frac{n}{2}\rfloor\),\(q = [n \bmod 2 = 1]\),即:当 \(n\) 为偶数时\(q=0\),\(n\) 为奇数时 \(q=1\),则 \(a^n = a^k \times a^k \times a^q\) 可以在 \(\mathcal{O}(\log n)\) 时间内求出 \(a^n\)
接下来考虑 \(g(n) = a + a^2 + \cdots + a^n\),同样的,使用分治先计算得到 \(g(k)\) 的值,发现 \(g(k)\) 与 \(g(n)\) 之间缺了 \(a^{k+1} + a^{k+2} + a^{k+3} + \cdots + a^{2k} + qa^n\),前面 \(k\) 项的和可以表示为 \(a^kg(k)\),因此得到 \(g(n) = (1+a^k)g(k) + qa^n\)
有了上面的方法之后,计算 \(a + 2a^2 + \cdots + na^n\) 就显得轻车熟路了。先计算 \(f(k)\),缺的项为 \((k+1)a^{k+1} + (k+2)a^{k+2} + \cdots + 2ka^{2k} + qna^n\),前面 \(k\) 项可以提公因式 \(a^k\),再展开前面的 \(k+i\),得到 \((k+1)a^{k+1} + (k+2)a^{k+2} + \cdots + 2ka^{2k} = a^k(ka+ka^2+\cdots + ka^k + a + 2a^2 + \cdots + ka^k) = ka^kg(k) + a^kf(k)\),因此 \(f(n) = f(k) + ka^kg(k) + a^kf(k) + qna^n\)
浙公网安备 33010602011771号