题目大意
设 Fibonacci 数列第 $i$ 项为 $F_i$,求
$$ S = \sum_{i = 0}^n (F_{i c})^k $$
分析
由特征方程法,设
$$ x^2 + x - 1 = 0 \Longrightarrow A, B = \frac{1 \pm \sqrt{5}}{2} $$
因此 Fibonacci 通项公式即可表示为
$$ F_n = \frac{A^n - B^n}{A - B} $$
根据二次剩余的知识,模意义下是可以开方的。因此
$$ (F_{i c})^k = \left( \frac{A^{i c} - B^{i c}}{A - B} \right)^k = \frac{1}{(A - B)^k} \sum_{j = 0}^k \binom{k}{j} (- 1)^{k - j} (A^j B^{k - j})^{i c} $$
求和有
$$ (A - B)^k S = (A - B)^k \sum_{i = 0}^n (F_{i c})^k = \sum_{i = 0}^n \sum_{j = 0}^k \binom{k}{j} (- 1)^{k - j} (A^j B^{k - j})^{i c} $$
换序求和,即是等比数列(公比可能为 $1$,需要特判)
$$ \begin{aligned} (A-B)^{k}S & =\sum_{j=0}^{k}\binom{k}{j}(-1)^{k-j}\sum_{i=0}^{n}(A^{j}B^{k-j})^{ic}\\ & =\sum_{j=0}^{k}\binom{k}{j}(-1)^{k-j}{\frac{(A^{j}B^{k-j})^{c(n+1)}-1}{(A^{j}B^{k-j})^{c}-1}} \end{aligned} $$
直接计算会 TLE,需要用中间变量简化
$$ \frac{(A^j B^{k - j})^{c (n + 1)} - 1}{(A^j B^{k - j})^c - 1} = \frac{B^{k c (n + 1)} {(A B^{- 1})^{c (n + 1) j}} - 1}{B^{k c} (A B^{- 1})^{c j} - 1} $$
用中间变量在循环中递推,再加上 Euler 降幂,就可以过题了。
const ll mod = 1e9 + 9, phi_mod = mod - 1;
const ll maxn = 1e5 + 10;
#define ACM_MOD mod
#include "template/basic/qpow.hpp"
#include "template/basic/inv.hpp"
const ll sqrt_5 = 383008016;
const ll A = (1 + sqrt_5) * inv(2) % mod, B = (1 - sqrt_5 + mod) * inv(2) % mod;
ll euler_pow(ll a, ll b) {
return qpow(a, b % phi_mod);
}
ll fac[maxn], ind[maxn];
void pre(ll n) {
fac[0] = 1;
for (ll i = 1; i <= n; i++) {
fac[i] = fac[i - 1] * i % mod;
}
ind[n] = inv(fac[n]);
for (ll i = n - 1; i >= 0; i--) {
ind[i] = ind[i + 1] * (i + 1) % mod;
}
}
ll binom(ll a, ll b) {
if (b > a)
b = a - b;
return fac[a] * ind[b] % mod * ind[a - b] % mod;
}
int main() {
pre(1e5 + 1);
ll ttt = rr();
while (ttt--) {
ll n = rr(), c = rr(), k = rr();
ll step1 = euler_pow(A * inv(B) % mod, c), step2 = euler_pow(step1, n + 1);
ll T1 = euler_pow(B, c % phi_mod * k), T2 = euler_pow(T1, n + 1);
ll ans = 0;
for (ll j = 0; j <= k; j++) {
ll tsum = binom(k, j);
if (T1 != 1) {
tsum = tsum * (T2 - 1) % mod * inv(T1 - 1) % mod;
} else {
tsum = (n + 1) % mod * tsum % mod;
}
if ((k - j) % 2 == 1)
tsum *= -1;
ans = (ans + tsum + mod) % mod;
T1 = T1 * step1 % mod, T2 = T2 * step2 % mod;
}
ans = ans % mod * euler_pow(inv(A - B), k) % mod;
printf("%lld\n", ans);
}
return 0;
}