2019牛客多校第九场AThe power of Fibonacci(广义BM)

题目大意

求斐波那契数列m次方的前n项和

解题思路

显然,斐波那契的m次方前缀和依然是线性递推,因此考虑用exBM求解,套板子就行

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=1e9;
struct LinearRecurrence {using vec = std::vector<LL>;static void extand(vec &a, size_t d, LL value = 0) {if (d <= a.size()) return;a.resize(d, value);}static void exgcd(LL a, LL b, LL &g, LL &x, LL &y) {if (!b) x = 1, y = 0, g = a;else {exgcd(b, a % b, g, y, x);y -= x * (a / b);}}static LL crt(const vec &c, const vec &m) {int n = c.size();LL M = 1, ans = 0;for (int i = 0; i < n; ++i) M *= m[i];for (int i = 0; i < n; ++i) {LL x, y, g, tm = M / m[i];exgcd(tm, m[i], g, x, y);ans = (ans + tm * x * c[i] % M) % M;}return (ans + M) % M;}static vec ReedsSloane(const vec &s, LL mod) {auto inverse = [](LL a, LL m) {LL d, x, y;exgcd(a, m, d, x, y);return d == 1 ? (x % m + m) % m : -1;};auto L = [](const vec &a, const vec &b) {int da = (a.size() > 1 || (a.size() == 1 && a[0])) ? a.size() - 1 : -1000;int db = (b.size() > 1 || (b.size() == 1 && b[0])) ? b.size() - 1 : -1000;return std::max(da, db + 1);};auto prime_power = [&](const vec &s, LL mod, LL p, LL e) {// linear feedback shift register mod p^e, p is primestd::vector<vec> a(e), b(e), an(e), bn(e), ao(e), bo(e);vec t(e), u(e), r(e), to(e, 1), uo(e), pw(e + 1);pw[0] = 1;for (int i = pw[0] = 1; i <= e; ++i) pw[i] = pw[i - 1] * p;for (LL i = 0; i < e; ++i) {a[i] = {pw[i]}, an[i] = {pw[i]};b[i] = {0}, bn[i] = {s[0] * pw[i] % mod};t[i] = s[0] * pw[i] % mod;if (t[i] == 0)t[i] = 1, u[i] = e;elsefor (u[i] = 0; t[i] % p == 0; t[i] /= p, ++u[i]);}for (size_t k = 1; k < s.size(); ++k) {for (int g = 0; g < e; ++g)if (L(an[g], bn[g]) > L(a[g], b[g])) {ao[g] = a[e - 1 - u[g]];bo[g] = b[e - 1 - u[g]];to[g] = t[e - 1 - u[g]];uo[g] = u[e - 1 - u[g]];r[g] = k - 1;}a = an, b = bn;for (int o = 0; o < e; ++o) {LL d = 0;for (size_t i = 0; i < a[o].size() && i <= k; ++i) {d = (d + a[o][i] * s[k - i]) % mod;}if (d == 0) {t[o] = 1, u[o] = e;} else {for (u[o] = 0, t[o] = d; t[o] % p == 0; t[o] /= p, ++u[o]);int g = e - 1 - u[o];if (L(a[g], b[g]) == 0) {extand(bn[o], k + 1);bn[o][k] = (bn[o][k] + d) % mod;} else {LL coef =t[o] * inverse(to[g], mod) % mod * pw[u[o] - uo[g]] % mod;int m = k - r[g];extand(an[o], ao[g].size() + m);extand(bn[o], bo[g].size() + m);for (size_t i = 0; i < ao[g].size(); ++i) {an[o][i + m] -= coef * ao[g][i] % mod;if (an[o][i + m] < 0) an[o][i + m] += mod;}while (an[o].size() && an[o].back() == 0) an[o].pop_back();for (size_t i = 0; i < bo[g].size(); ++i) {bn[o][i + m] -= coef * bo[g][i] % mod;if (bn[o][i + m] < 0) bn[o][i + m] -= mod;}while (bn[o].size() && bn[o].back() == 0) bn[o].pop_back();}}}}return std::make_pair(an[0], bn[0]);};std::vector<std::tuple<LL, LL, int>> fac;for (LL i = 2; i * i <= mod; ++i)if (mod % i == 0) {LL cnt = 0, pw = 1;while (mod % i == 0) mod /= i, ++cnt, pw *= i;fac.emplace_back(pw, i, cnt);}if (mod > 1) fac.emplace_back(mod, mod, 1);std::vector<vec> as;size_t n = 0;for (auto &&x: fac) {LL mod, p, e;vec a, b;std::tie(mod, p, e) = x;auto ss = s;for (auto &&x: ss) x %= mod;std::tie(a, b) = prime_power(ss, mod, p, e);as.emplace_back(a);n = std::max(n, a.size());}vec a(n), c(as.size()), m(as.size());for (size_t i = 0; i < n; ++i) {for (size_t j = 0; j < as.size(); ++j) {m[j] = std::get<0>(fac[j]);c[j] = i < as[j].size() ? as[j][i] : 0;}a[i] = crt(c, m);}return a;}LinearRecurrence(const vec &s, const vec &c, LL mod) :init(s), trans(c), mod(mod), m(s.size()) {}LinearRecurrence(const vec &s, LL mod, bool is_prime = true) : mod(mod) {vec A;A = ReedsSloane(s, mod);if (A.empty()) A = {0};m = A.size() - 1;trans.resize(m);for (int i = 0; i < m; ++i) trans[i] = (mod - A[i + 1]) % mod;std::reverse(trans.begin(), trans.end());init = {s.begin(), s.begin() + m};}LL calc(LL n) {if (mod == 1) return 0;if (n < m) return init[n];vec v(m), u(m << 1);int msk = !!n;for (LL m = n; m > 1; m >>= 1) msk <<= 1;v[0] = 1 % mod;for (int x = 0; msk; msk >>= 1, x <<= 1) {std::fill_n(u.begin(), m * 2, 0);x |= !!(n & msk);if (x < m) u[x] = 1 % mod;else {// can be optimized by fft/nttfor (int i = 0; i < m; ++i)for (int j = 0, t = i + (x & 1); j < m; ++j, ++t)u[t] = (u[t] + v[i] * v[j]) % mod;for (int i = m * 2 - 1; i >= m; --i)for (int j = 0, t = i - m; j < m; ++j, ++t)u[t] = (u[t] + trans[j] * u[i]) % mod;}v = {u.begin(), u.begin() + m};}LL ret = 0;for (int i = 0; i < m; ++i) ret = (ret + v[i] * init[i]) % mod;return ret;}vec init, trans;LL mod;int m;
};
int quick_pow(int a,int b)
{int ans=1;while(b){if(b&1) ans=1LL*a*ans%mod;a=1LL*a*a%mod;b>>=1;}return ans;
}
int main()
{int n,m;scanf("%d%d",&n,&m);vector<LL> f;f.push_back(0),f.push_back(1);for(int i=2;i<=2000;i++){f.push_back((f[i-1]+f[i-2])%mod);}for(int i=1;i<=2000;i++) f[i]=quick_pow(f[i],m);for(int i=1;i<=2000;i++) f[i]=(f[i]+f[i-1])%mod;LinearRecurrence qw(f,mod,false);printf("%lld\n",qw.calc(n));
}

2019牛客多校第九场AThe power of Fibonacci(广义BM)相关推荐

  1. 2019牛客多校第九场AThe power of Fibonacci——扩展BM

    题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...

  2. Quadratic equation(二次剩余)2019牛客多校第九场

    链接:https://ac.nowcoder.com/acm/contest/889/B 来源:牛客网 题目描述 Amy asks Mr. B problem B. Please help Mr. B ...

  3. 2019牛客多校第九场 H Cutting Bamboos (二分主席树)

    看到题解说二分 心里也有数了..... H Cutting Bamboos 给了一些高度得柱子 每区间你可以坎y次 y次之后 必须砍没有了 没有砍 总长度得一样 问第x次砍得高度在哪里 因为砍得次数 ...

  4. 2019牛客多校第一场

    2019牛客多校第一场 题号 题目 知识点 A Monotonic Matrix B Symmetric Matrix C Fluorescent 2 D Two Graphs E Removal F ...

  5. Cutting Bamboos(牛客多校第九场H主席树+二分+思维)

    链接:https://ac.nowcoder.com/acm/contest/889/H 来源:牛客网 There are n bamboos arranged in a line. The i-th ...

  6. 2019 牛客多校第二场 4/10

    题会慢慢补完的,最近在帮别人上课,补题速度很慢,一边看ppt一边刷ppt的题还要补多校的,感觉有点应付不过来,不过以后会慢慢补完的(指整个暑假) A 这场出题人的英文水平真的搞事,不说了((( 这题起 ...

  7. 2019 牛客多校第一场 F Random Point in Triangle

    题目链接:https://ac.nowcoder.com/acm/contest/881/F 题目大意 给定二维平面上 3 个整数表示的点 A,B,C,在三角形 ABC 内随机选一点 P,求期望$E ...

  8. 2019 牛客多校第一场 E ABBA

    题目链接:https://ac.nowcoder.com/acm/contest/881/E 题目大意 问有多少个由 (n + m) 个 'A' 和 (n + m) 个 'B',组成的字符串能被分割成 ...

  9. 牛客多校第九场 H Cutting Bamboos —— 主席树

    题目链接:点我啊╭(╯^╰)╮ 题目大意: 给你一片竹林,编号 1 1 1 到 n n n ,给定初始高度     每次查询区间,问一共砍 y y y 刀的时候,第 x x x 刀的高度     要求 ...

最新文章

  1. 深入理解java虚拟机(7)---线程安全  锁优化
  2. Java获取近七天的数据条数,及页面实现折线图(附前后端代码)
  3. contract net with fipa
  4. 漫画:数据中台中台建设的十大误区(建议收藏)
  5. python 从入门到实践 pdf_python入门基础实践课,带你有效的学习python
  6. SQL:mysql将datetime类型数据格式化
  7. 1. MFC编程——变量命名规则
  8. 易班自动答题脚本_在线答题系统,支持多种题型,增加问答题编辑器样式
  9. html文件做屏保win10,win10怎么自己添加动态屏保
  10. 表格类产品标签的制作
  11. 双三次插值算法的C++实现与SSE指令优化
  12. 学建模从软件开始,8款超级好用的3d建模软件(内有安装包领取途径)
  13. 计算机主机hdmi接口是什么意思,hdmi接口有什么用,教您电脑hdmi接口有什么用
  14. 基于ZYNQ、AM5728、AM5708、AM437x、AM335x、STM32+FPGA等平台提供了开源EtherCAT主站IgH案例
  15. 2021春考计算机技能考什么,春季高考技能考试-信息技术类专业考试样题
  16. Oracle的SQL注入
  17. 我用python给我的可爱小邻居做了一个猫狗识别系统~
  18. 可落地的DDD(5)-战术设计
  19. 一文带你盘点市场上主流的BI产品主要有哪些
  20. Excel根据某列的值,用不同颜色区分数据行

热门文章

  1. no suitable driver found解决方法
  2. 把USB打印机映射到LPT端口(简约版)
  3. 几何画板v5.0.6源文件(破解成功)
  4. python中的for循环与切片
  5. 圆形标定板_一种圆阵列标定板特征点提取方法与流程
  6. 如何解决偏振衰落问题---偏振分集
  7. 乌鲁木齐市全国计算机等级考试,新疆2010年下半年计算机等级考试报名地点
  8. 华为41岁年薪超百万的架构师被裁员,之前年薪到手120万
  9. 摩伴windows桌面服务器,魔伴Windows桌面app
  10. 数据抓取 -- 使用代理IP爬取数据:(2):使用timeout 时要注意,防止数据加载不完整 ,导致爬取丢失(举例)