51nod 1236 序列求和 V3
2018-03-23 21:00
281 查看
题目
Fib(n)表示斐波那契数列的第n项,Fib(n) = Fib(n-1) + Fib(n-2)。Fib(0) = 0, Fib(1) = 1。(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, …)
F(n, k) = Fib(n)^k(Fib(n)的k次幂)。
S(n, k) = F(1, k) + F(2, k) + …… F(n, k)。
例如:S(4, 2) = 1^2 + 1^2 + 2^2 + 3^2 = 15。
给出n和k,求S(n, k) Mod 1000000009的结果。
分析
把斐波那契通项求和二项式展开之后会发现那是一个等比数列,然后暴力求代码
#include <bits/stdc++.h> typedef long long LL; const int MOD = 1000000009; const int g = 616991993; const int N = 100005; int jc ,ny ,v1 ,v2 ; int ksm(int x,LL y) { int ans = 1; while (y) { if (y & 1) ans = (LL)ans * x % MOD; x = (LL)x * x % MOD; y >>= 1; } return ans; } int get_sum(int q,LL n) { return (LL)(ksm(q,n + 1) + MOD - q) * ksm(q - 1, MOD - 2) % MOD; } int solve(LL n,int k) { int ans = 0; for (int i = 0; i <= k; i++) { int w = (LL)v1[i] * v2[k - i] % MOD; w = w == 1 ? n % MOD : get_sum(w,n); if ((k - i) & 1) ans += MOD - (LL)jc[k] * ny[i] % MOD * ny[k - i] % MOD * w % MOD; else ans += (LL)jc[k] * ny[i] % MOD * ny[k - i] % MOD * w % MOD; ans -= ans >= MOD ? MOD :0; } ans = (LL)ans * ksm(g,(LL)k * (MOD - 2) % (MOD - 1)) % MOD; return ans; } int main() { int T; scanf("%d",&T); jc[0] = jc[1] = ny[0] = ny[1] = 1; for (int i = 2; i <= 100000; i++) jc[i] = (LL)jc[i - 1] * i % MOD, ny[i] = (LL)(MOD - MOD / i) * ny[MOD % i] % MOD; for (int i = 2; i <= 100000; i++) ny[i] = (LL)ny[i - 1] * ny[i] % MOD; v1[0] = v2[0] = 1; for (int i = 1; i <= 100000; i++) v1[i] = (LL)v1[i - 1] * (1 + g) % MOD * ny[2] % MOD, v2[i] = (LL)v2[i - 1] * (1 + MOD - g) % MOD * ny[2] % MOD; while (T--) { LL n;int k; scanf("%lld%d",&n,&k); printf("%d\n",solve(n,k)); } }
相关文章推荐
- 51nod_1236_序列求和 V3 _组合数学
- 51nod 1236 序列求和 V3 数学
- 51nod 1258 序列求和 V4 拉格朗日插值法求自然数幂和
- 【51nod】1822 序列求和 V5
- [伯努利数] 51Nod 1258 序列求和 V4
- [51nod 1258] [伯努利数] [多项式求逆] [任意模数NTT] 序列求和 V4
- 51nod 1258 序列求和 V4
- 51nod1236 序列求和 V3 【数学】
- 51nod 1228 序列求和 伯努利数
- 51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]
- 51nod 1258:序列求和 V4(伯努利数+多项式求逆+NTT+CRT)
- 51Nod 1228 序列求和
- 51nod 1228 序列求和
- 51nod 1229 序列求和 V2 数学+自然数幂和
- 51nod 1258 序列求和 V4
- 51nod 1258 序列求和 V4 拉格朗日插值
- [51NOD]1288 序列求和 V4 拉格朗日插值法
- 51Nod-1228-序列求和
- 51NOD 序列求和 V5题解
- 51nod 1228 序列求和 ( 1^k+2^k+3^k+...+n^k )