这个板子能够解决任何线性递推式,只要你确定某个数列的某项只与前几项线性相关,那么把它前若干项丢进去,这个板子就能给你返回你要求的某项的值。

原理???(待补充)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define rep(i,a,n) for (int i=a;i<n;i++)
  4. #define per(i,a,n) for (int i=n-1;i>=a;i--)
  5. #define pb push_back
  6. #define mp make_pair
  7. #define all(x) (x).begin(),(x).end()
  8. #define fi first
  9. #define se second
  10. #define SZ(x) ((int)(x).size())
  11. typedef vector<int> VI;
  12. typedef long long ll;
  13. typedef pair<int,int> PII;
  14. const ll mod=;
  15. ll powmod(ll a,ll b) {ll res=;a%=mod; assert(b>=); for(;b;b>>=){if(b&)res=res*a%mod;a=a*a%mod;}return res;}
  16. ll _,n;
  17. namespace linear_seq{
  18. const int N=;
  19. ll res[N],base[N],_c[N],_md[N];
  20. vector<ll> Md;
  21. void mul(ll *a,ll *b,int k)
  22. {
  23. rep(i,,k+k) _c[i]=;
  24. rep(i,,k) if (a[i]) rep(j,,k) _c[i+j]=(_c[i+j]+a[i]*b[j])%mod;
  25. for (int i=k+k-;i>=k;i--) if (_c[i])
  26. rep(j,,SZ(Md)) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod;
  27. rep(i,,k) a[i]=_c[i];
  28. }
  29. int solve(ll n,VI a,VI b)
  30. {
  31. ll ans=,pnt=;
  32. int k=SZ(a);
  33. assert(SZ(a)==SZ(b));
  34. rep(i,,k) _md[k--i]=-a[i];_md[k]=;
  35. Md.clear();
  36. rep(i,,k) if (_md[i]!=) Md.push_back(i);
  37. rep(i,,k) res[i]=base[i]=;
  38. res[]=;
  39. while ((1ll<<pnt)<=n) pnt++;
  40. for (int p=pnt;p>=;p--)
  41. {
  42. mul(res,res,k);
  43. if ((n>>p)&)
  44. {
  45. for (int i=k-;i>=;i--) res[i+]=res[i];res[]=;
  46. rep(j,,SZ(Md)) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod;
  47. }
  48. }
  49. rep(i,,k) ans=(ans+res[i]*b[i])%mod;
  50. if (ans<) ans+=mod;
  51. return ans;
  52. }
  53. VI BM(VI s) {
  54. VI C(,),B(,);
  55. int L=,m=,b=;
  56. rep(n,,SZ(s)) {
  57. ll d=;
  58. rep(i,,L+) d=(d+(ll)C[i]*s[n-i])%mod;
  59. if (d==) ++m;
  60. else if (*L<=n) {
  61. VI T=C;
  62. ll c=mod-d*powmod(b,mod-)%mod;
  63. while (SZ(C)<SZ(B)+m) C.pb();
  64. rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
  65. L=n+-L; B=T; b=d; m=;
  66. } else {
  67. ll c=mod-d*powmod(b,mod-)%mod;
  68. while (SZ(C)<SZ(B)+m) C.pb();
  69. rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
  70. ++m;
  71. }
  72. }
  73. return C;
  74. }
  75. int gao(VI a,ll n){
  76. VI c=BM(a);
  77. c.erase(c.begin());
  78. rep(i,,SZ(c)) c[i]=(mod-c[i])%mod;
  79. return solve(n,c,VI(a.begin(),a.begin()+SZ(c)));
  80. }
  81. };
  82. int main()
  83. {
  84. int t;
  85. scanf("%d",&t);
  86. while(t--)
  87. {
  88. scanf("%lld",&n);
  89. vector<int>v;
  90. v.push_back(); //至少8项,越多越好。
  91. printf("%lld\n",linear_seq::gao(v,n-)%mod);
  92. }
  93. }

黑科技之杜教bm的更多相关文章

  1. ZZNU 2182 矩阵dp (矩阵快速幂+递推式 || 杜教BM)

    题目链接:http://47.93.249.116/problem.php?id=2182 题目描述 河神喜欢吃零食,有三种最喜欢的零食,鱼干,猪肉脯,巧克力.他每小时会选择一种吃一包. 不幸的是,医 ...

  2. 牛客多校第九场 A The power of Fibonacci 杜教bm解线性递推

    题意:计算斐波那契数列前n项和的m次方模1e9 题解: $F[i] – F[i-1] – F[i-2] = 0$ $F[i]^2 – 2 F[i-1]^2 – 2 F[i-2]^2 + F[i-3] ...

  3. 杜教BM【转载】

    https://blog.csdn.net/qq_36876305/article/details/80275708 #include <bits/stdc++.h> using name ...

  4. 杜教BM

    #include <algorithm> #include <iterator> #include <iostream> #include <cstring& ...

  5. 杜教BM递推板子

    Berlekamp-Massey 算法用于求解常系数线性递推式 #include<bits/stdc++.h> typedef std::vector<int> VI; typ ...

  6. 杜教BM模板

    #include<bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #defi ...

  7. BM求线性递推模板(杜教版)

    BM求线性递推模板(杜教版) BM求线性递推是最近了解到的一个黑科技 如果一个数列.其能够通过线性递推而来 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元 ...

  8. [自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”

    NOW, 步 将此黑科技传授予你~ 一.普通家电控制电路板分析 普通家电,其人机接口一般由按键和指示灯组成(高端的会稍微复杂,这里不考虑) 这样交互过程,其实就是:由当前指示灯信息,按照操作流程按相应 ...

  9. HDU 6395 Sequence 杜教板子题

    题目意思非常明确,就是叫你求第n项,据我们学校一个大佬说他推出了矩阵,但是我是菜鸡,那么肯定是用简单的方法水过啦!我们先p^(1/2)的复杂度处理出i=[i,p]范围内的所有种类的(int)(p/i) ...

随机推荐

  1. SpringBoot - @ControllerAdvice 处理异常

    在Spring 3.2中,新增了@ControllerAdvice.@RestControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@Mode ...

  2. 【JZOJ6433】【luoguP5664】【CSP-S2019】Emiya 家今天的饭

    description analysis 首先可以知道不符合要求的食材仅有一个,于是可以容斥拿总方案数减去选不合法食材的不合法方案数 枚举选取哪一个不合法食材,设\(f[i][j]\)表示到第\(i\ ...

  3. 表格table隔行变色

    if($('.p03-s2').find('table').length >= 2) {$('table:last-child').css({'borderTop': 'none'});}if( ...

  4. demo BaseDao随笔,hibernate框架

    /** * 增加entity * * @param Object对象 * @throws Exception */ public <T> void save(T ob) throws Ex ...

  5. 2018—2019—2 20165239《网络对抗技术》Exp7 网络欺诈防范

    一.原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET工具建立冒名网站 (1分) ettercap DNS ...

  6. postgreSQL的主外键

    --添加主键 alter table cities add PRIMARY KEY(name); --添加外键 alter table weather add FOREIGN key(city) RE ...

  7. Go语言基础:make,new, len, cap, append, delete方法

      前面提到不少Go的内建函数,这篇文章学习下如何使用.. make 先拿 make 开刀,可是一开始我就进入了误区,因为我想先找到他的源码,先是发现 src/builtin/builtin.go 中 ...

  8. shell重定向的顺序问题

    三个默认的文件描述符 0: stdin(标准输入) 1: stdout(标准输出) 2: stderr(标准错误输出) 系统中这3个文件描述符所对应的文件: 重定向顺序 示例脚本 echo " ...

  9. 1044 Shopping in Mars (25 分)

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  10. animation和keyframes

    animation:name duration timing-function delay iteration-count direction; name:名字 duration: 持续时间 timi ...