user 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 斐波那契数多项式 斐波那契数{fn, n ≥ 0}由递归式fn = fn-1 + fn-2给出,初值是f0 = 0和f1 = 1。 定义多项式{Fn, n ≥ 0}为Fn(x) = ∑fixi,其中0 ≤ i ≤ n。 例如,F7(x) = x + x2 + 2x3 + 3x4 + 5x5 + 8x6 + 13x7,而F7(11) = 268357683. 取n = 10^{15}。求[∑_{0≤x≤100} Fn(x)] mod 1307674368000 (= 15!)。 我的思路:矩阵快速幂. 首先枚举x. 记录F_y(x)的值,有 F_(y)(x)=(x^2)F_(y-2)(x)+(x)F_(y-1)(x)+x 那么直接维护即可.请给我c++代码
gpt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 你的思路是**完全正确的**,而且这个题目本质上就是: > 对每个 (x\in[0,100]),用 **矩阵快速幂** 在 (O(\log n)) 时间内算出 > (F_n(x)=\sum_{i=0}^n f_i x^i), > 然后求和并取模。 下面我先把递推关系**严格整理清楚**,再给你一份**可直接用的 C++ 实现**。 --- ## 一、递推关系的推导(确认你写的式子) 已知: [ f_i = f_{i-1}+f_{i-2} ] 定义: [ F_n(x)=\sum_{i=0}^n f_i x^i ] 我们有: [ \begin{aligned} F_n(x) &= F_{n-1}(x) + f_n x^n \ &= F_{n-1}(x) + (f_{n-1}+f_{n-2})x^n \ &= F_{n-1}(x) + x\cdot f_{n-1}x^{n-1} + x^2\cdot f_{n-2}x^{n-2} \end{aligned} ] 注意到: [ \begin{aligned} f_{n-1}x^{n-1} &= F_{n-1}(x)-F_{n-2}(x) \ f_{n-2}x^{n-2} &= F_{n-2}(x)-F_{n-3}(x) \end{aligned} ] 整理后可得一个**二阶非齐次线性递推**: [ \boxed{ F_n(x) = x F_{n-1}(x) + x^2 F_{n-2}(x) + x } ] 与你写的是一致的 ✅ --- ## 二、矩阵形式 设状态向量: [ \mathbf{v}*n= \begin{bmatrix} F_n(x)\ F*{n-1}(x)\ 1 \end{bmatrix} ] 则: [ \mathbf{v}*n = \begin{bmatrix} x & x^2 & x \ 1 & 0 & 0 \ 0 & 0 & 1 \end{bmatrix} \mathbf{v}*{n-1} ] 初值: [ F_0(x)=0,\quad F_1(x)=x ] 所以: [ \mathbf{v}_1= \begin{bmatrix} x\ 0\ 1 \end{bmatrix} ] 我们要算: [ \mathbf{v}_n = M^{,n-1}\mathbf{v}_1 ] --- ## 三、整体复杂度 * (x = 0\sim100),共 **101 次** * 每次 3×3 矩阵快速幂:(O(\log n)) * 总复杂度: [ O(101\cdot 3^3\log n) \quad\text{极其轻松} ] --- ## 四、完整 C++ 实现(可直接交)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 #include <bits/stdc++.h> using namespace std;static const long long MOD = 1307674368000LL ; struct Mat { long long a[3 ][3 ]; }; Mat mul (const Mat &A, const Mat &B) { Mat C{}; for (int i = 0 ; i < 3 ; i++) { for (int k = 0 ; k < 3 ; k++) { if (A.a[i][k] == 0 ) continue ; for (int j = 0 ; j < 3 ; j++) { __int128 tmp = (__int128)A.a[i][k] * B.a[k][j]; C.a[i][j] = (C.a[i][j] + tmp) % MOD; } } } return C; } Mat mpow (Mat base, long long exp) { Mat res{}; for (int i = 0 ; i < 3 ; i++) res.a[i][i] = 1 ; while (exp > 0 ) { if (exp & 1 ) res = mul (res, base); base = mul (base, base); exp >>= 1 ; } return res; } long long calc_Fn (long long n, long long x) { if (n == 0 ) return 0 ; if (n == 1 ) return x % MOD; Mat M{}; M.a[0 ][0 ] = x % MOD; M.a[0 ][1 ] = (x * x) % MOD; M.a[0 ][2 ] = x % MOD; M.a[1 ][0 ] = 1 ; M.a[2 ][2 ] = 1 ; Mat P = mpow (M, n - 1 ); long long Fn = ( (__int128)P.a[0 ][0 ] * x + (__int128)P.a[0 ][2 ] * 1 ) % MOD; return Fn; } int main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); const long long n = 1000000000000000LL ; long long ans = 0 ; for (int x = 0 ; x <= 100 ; x++) { ans = (ans + calc_Fn (n, x)) % MOD; } cout << ans << "\n" ; return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 --- ## 五、几点关键说明(非常重要) 1. **一定要用 `__int128`** 因为中间乘法最大约: [ (15!)^2 \approx 10^{24} ] 2. **模数不是质数** 所以不能用任何逆元或除法,只能老老实实矩阵乘。 3. **x = 0 也能正常处理** 矩阵自然退化,代码不需要特判。 --- 如果你愿意,下一步我可以帮你: * 把 3×3 压缩成 2×2(更优雅) * 给出数学上的生成函数解法 * 或直接证明这个递推为什么一定成立 这道题本身是**竞赛级 + 数论味道很浓**的好题 👍
fun fact Flu认为gpt比上gemini完全不行,但是比下deepseek还是绰绰有余的,所以作为首选欧拉计划御用AI,WA了再考虑换模型.