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

杜教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

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

  4. 杜教BM递推板子

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

  5. 杜教BM模板

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

  6. 黑科技之杜教bm

    这个板子能够解决任何线性递推式,只要你确定某个数列的某项只与前几项线性相关,那么把它前若干项丢进去,这个板子就能给你返回你要求的某项的值. 原理???(待补充) #include<bits/st ...

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

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

  8. HDU 6395 Sequence 杜教板子题

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

  9. bzoj 4176: Lucas的数论 -- 杜教筛,莫比乌斯反演

    4176: Lucas的数论 Time Limit: 30 Sec  Memory Limit: 256 MB Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么 ...

随机推荐

  1. 改变Cube的Shader下的Alpha值,实现Cube若隐若现的效果。

    private float rotaSpeed = 5f; private float timer = 1; private bool flag = true; private float delay ...

  2. bzoj3412

    题解: 先把询问排序 然后根据单调性来做 代码: #include<bits/stdc++.h> using namespace std; ],b[],f[],ans[]; int cmp ...

  3. 【转载】 unity 塔防游戏

    原文地址: Part1的地址:http://www.cnblogs.com/lcxBlog/p/6075984.html Part2的地址:http://www.cnblogs.com/lcxBlog ...

  4. nginx启用php

    1. php下载https://secure.php.net/downloads.php搜索china镜像站点,从这里下载http://cn2.php.net/get/php-7.2.3.tar.gz ...

  5. 协程(Coroutine)与多线程,多进程

    执行多个任务可以使用多线程或多进程. 多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响 多线程中,所有变量都由所有线程共享.而线程间的切换是系统进行调度,无法控制,所以可能 一个进程中的 ...

  6. npm login npm publish报错

    . 把那个文件删除就好了 查看npm是淘宝的还是原始的 npm config get registry 如果是淘宝的要退回到原始的 npm config set registry=http://reg ...

  7. Chrome浏览器录屏扩展插件

    Chrome浏览器录屏扩展插件,可以录制网页操作或者桌面操作.生成MP4 Loom https://chrome.google.com/webstore/detail/loom-video-recor ...

  8. restful接口设计规范总结

    这篇 文章主要是借鉴他人,但是自己很想总结出一套规范,以供向我这样的新手使用,用来规范代码,如果有什么好的提议,请不吝赐教,本篇文章长期更新! 一.重要概念: REST,即Representation ...

  9. golang统计出其中英文字母、空格、数字和其它字符的个数

    方法一 通过ASCII码表判断并统计 package main import "fmt" func charactortype() { var s2 string = " ...

  10. mysql三范式

    第一范式:有主键,具有原子性,字段不可分割. 第二范式:完全依赖,没有部分依赖. 第三范式:没有传递依赖. 总结:数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时候会拿冗余还速度,最总用的 ...