也就是模数不是质数的时候,

//下面的板子能求质数和非质数,只需要传不同的参数。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cassert>
  4. #include <cstring>
  5. #include <bitset>
  6. #include <cmath>
  7. #include <cctype>
  8. #include <unordered_map>
  9. #include <iostream>
  10. #include <algorithm>
  11. #include <string>
  12. #include <vector>
  13. #include <queue>
  14. #include <map>
  15. #include <set>
  16. #include <sstream>
  17. #include <iomanip>
  18. using namespace std;
  19. typedef long long ll;
  20. typedef vector<long long> VI;
  21. typedef unsigned long long ull;
  22. const ll inff = 0x3f3f3f3f3f3f3f3f;
  23. const ll mod=1e9;
  24. #define FOR(i,a,b) for(int i(a);i<=(b);++i)
  25. #define FOL(i,a,b) for(int i(a);i>=(b);--i)
  26. #define SZ(x) ((long long)(x).size())
  27. #define REW(a,b) memset(a,b,sizeof(a))
  28. #define inf int(0x3f3f3f3f)
  29. #define si(a) scanf("%d",&a)
  30. #define sl(a) scanf("%I64d",&a)
  31. #define sd(a) scanf("%lf",&a)
  32. #define ss(a) scanf("%s",a)
  33. #define pb push_back
  34. #define eps 1e-6
  35. #define lc d<<1
  36. #define rc d<<1|1
  37. #define Pll pair<ll,ll>
  38. #define P pair<int,int>
  39. #define pi acos(-1)
  40. ll powmod(ll a,ll b)
  41. {
  42. ll res=1ll;
  43. while(b)
  44. {
  45. if(b&) res=res*a%mod;
  46. a=a*a%mod,b>>=;
  47. }
  48. return res;
  49. }
  50. namespace linear_seq {
  51. const int N=;
  52. using int64 = long long;
  53. using vec = std::vector<int64>;
  54. ll res[N],base[N],_c[N],_md[N];
  55. vector<int> Md;
  56. void mul(ll *a,ll *b,int k) {
  57. FOR(i,,k+k-) _c[i]=;
  58. FOR(i,,k-) if (a[i]) FOR(j,,k-) _c[i+j]=(_c[i+j]+a[i]*b[j])%mod;
  59. for (int i=k+k-;i>=k;i--) if (_c[i])
  60. FOR(j,,SZ(Md)-) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod;
  61. FOR(i,,k-) a[i]=_c[i];
  62. }
  63. int solve(ll n,VI a,VI b) { // a 系数 b 初值 b[n+1]=a[0]*b[n]+...
  64. // printf("%d\n",SZ(b));
  65. ll ans=,pnt=;
  66. int k=SZ(a);
  67. assert(SZ(a)==SZ(b));
  68. FOR(i,,k-) _md[k--i]=-a[i];_md[k]=;
  69. Md.clear();
  70. FOR(i,,k-) if (_md[i]!=) Md.push_back(i);
  71. FOR(i,,k-) res[i]=base[i]=;
  72. res[]=;
  73. while ((1ll<<pnt)<=n) pnt++;
  74. for (int p=pnt;p>=;p--) {
  75. mul(res,res,k);
  76. if ((n>>p)&) {
  77. for (int i=k-;i>=;i--) res[i+]=res[i];res[]=;
  78. FOR(j,,SZ(Md)-) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod;
  79. }
  80. }
  81. FOR(i,,k-) ans=(ans+res[i]*b[i])%mod;
  82. if (ans<) ans+=mod;
  83. return ans;
  84. }
  85. VI BM(VI s) {
  86. VI C(,),B(,);
  87. int L=,m=,b=;
  88. FOR(n,,SZ(s)-) {
  89. ll d=;
  90. FOR(i,,L) d=(d+(ll)C[i]*s[n-i])%mod;
  91. if (d==) ++m;
  92. else if (*L<=n) {
  93. VI T=C;
  94. ll c=mod-d*powmod(b,mod-)%mod;
  95. while (SZ(C)<SZ(B)+m) C.pb();
  96. FOR(i,,SZ(B)-) C[i+m]=(C[i+m]+c*B[i])%mod;
  97. L=n+-L; B=T; b=d; m=;
  98. } else {
  99. ll c=mod-d*powmod(b,mod-)%mod;
  100. while (SZ(C)<SZ(B)+m) C.pb();
  101. FOR(i,,SZ(B)-) C[i+m]=(C[i+m]+c*B[i])%mod;
  102. ++m;
  103. }
  104. }
  105. return C;
  106. }
  107. static void extand(vec &a, size_t d, int64 value = ) {
  108. if (d <= a.size()) return;
  109. a.resize(d, value);
  110. }
  111. static void exgcd(int64 a, int64 b, int64 &g, int64 &x, int64 &y) {
  112. if (!b) x = , y = , g = a;
  113. else {
  114. exgcd(b, a % b, g, y, x);
  115. y -= x * (a / b);
  116. }
  117. }
  118. static int64 crt(const vec &c, const vec &m) {
  119. int n = c.size();
  120. int64 M = , ans = ;
  121. for (int i = ; i < n; ++i) M *= m[i];
  122. for (int i = ; i < n; ++i) {
  123. int64 x, y, g, tm = M / m[i];
  124. exgcd(tm, m[i], g, x, y);
  125. ans = (ans + tm * x * c[i] % M) % M;
  126. }
  127. return (ans + M) % M;
  128. }
  129. static vec ReedsSloane(const vec &s, int64 mod) {
  130. auto inverse = [](int64 a, int64 m) {
  131. int64 d, x, y;
  132. exgcd(a, m, d, x, y);
  133. return d == ? (x % m + m) % m : -;
  134. };
  135. auto L = [](const vec &a, const vec &b) {
  136. int da = (a.size() > || (a.size() == && a[])) ? a.size() - : -;
  137. int db = (b.size() > || (b.size() == && b[])) ? b.size() - : -;
  138. return std::max(da, db + );
  139. };
  140. auto prime_power = [&](const vec &s, int64 mod, int64 p, int64 e) {
  141. // linear feedback shift register mod p^e, p is prime
  142. std::vector<vec> a(e), b(e), an(e), bn(e), ao(e), bo(e);
  143. vec t(e), u(e), r(e), to(e, ), uo(e), pw(e + );;
  144. pw[] = ;
  145. for (int i = pw[] = ; i <= e; ++i) pw[i] = pw[i - ] * p;
  146. for (int64 i = ; i < e; ++i) {
  147. a[i] = {pw[i]}, an[i] = {pw[i]};
  148. b[i] = {}, bn[i] = {s[] * pw[i] % mod};
  149. t[i] = s[] * pw[i] % mod;
  150. if (t[i] == ) {
  151. t[i] = , u[i] = e;
  152. } else {
  153. for (u[i] = ; t[i] % p == ; t[i] /= p, ++u[i]);
  154. }
  155. }
  156. for (size_t k = ; k < s.size(); ++k) {
  157. for (int g = ; g < e; ++g) {
  158. if (L(an[g], bn[g]) > L(a[g], b[g])) {
  159. ao[g] = a[e - - u[g]];
  160. bo[g] = b[e - - u[g]];
  161. to[g] = t[e - - u[g]];
  162. uo[g] = u[e - - u[g]];
  163. r[g] = k - ;
  164. }
  165. }
  166. a = an, b = bn;
  167. for (int o = ; o < e; ++o) {
  168. int64 d = ;
  169. for (size_t i = ; i < a[o].size() && i <= k; ++i) {
  170. d = (d + a[o][i] * s[k - i]) % mod;
  171. }
  172. if (d == ) {
  173. t[o] = , u[o] = e;
  174. } else {
  175. for (u[o] = , t[o] = d; t[o] % p == ; t[o] /= p, ++u[o]);
  176. int g = e - - u[o];
  177. if (L(a[g], b[g]) == ) {
  178. extand(bn[o], k + );
  179. bn[o][k] = (bn[o][k] + d) % mod;
  180. } else {
  181. int64 coef = t[o] * inverse(to[g], mod) % mod * pw[u[o] - uo[g]] % mod;
  182. int m = k - r[g];
  183. extand(an[o], ao[g].size() + m);
  184. extand(bn[o], bo[g].size() + m);
  185. for (size_t i = ; i < ao[g].size(); ++i) {
  186. an[o][i + m] -= coef * ao[g][i] % mod;
  187. if (an[o][i + m] < ) an[o][i + m] += mod;
  188. }
  189. while (an[o].size() && an[o].back() == ) an[o].pop_back();
  190. for (size_t i = ; i < bo[g].size(); ++i) {
  191. bn[o][i + m] -= coef * bo[g][i] % mod;
  192. if (bn[o][i + m] < ) bn[o][i + m] -= mod;
  193. }
  194. while (bn[o].size() && bn[o].back() == ) bn[o].pop_back();
  195. }
  196. }
  197. }
  198. }
  199. return std::make_pair(an[], bn[]);
  200. };
  201. std::vector<std::tuple<int64, int64, int>> fac;
  202. for (int64 i = ; i * i <= mod; ++i)
  203. if (mod % i == ) {
  204. int64 cnt = , pw = ;
  205. while (mod % i == ) mod /= i, ++cnt, pw *= i;
  206. fac.emplace_back(pw, i, cnt);
  207. }
  208. if (mod > ) fac.emplace_back(mod, mod, );
  209. std::vector<vec> as;
  210. size_t n = ;
  211. for (auto &&x: fac) {
  212. int64 mod, p, e;
  213. vec a, b;
  214. std::tie(mod, p, e) = x;
  215. auto ss = s;
  216. for (auto &&x: ss) x %= mod;
  217. std::tie(a, b) = prime_power(ss, mod, p, e);
  218. as.emplace_back(a);
  219. n = std::max(n, a.size());
  220. }
  221. vec a(n), c(as.size()), m(as.size());
  222. for (size_t i = ; i < n; ++i) {
  223. for (size_t j = ; j < as.size(); ++j) {
  224. m[j] = std::get<>(fac[j]);
  225. c[j] = i < as[j].size() ? as[j][i] : ;
  226. }
  227. a[i] = crt(c, m);
  228. }
  229. return a;
  230. }
  231. ll gao(VI a,ll n,ll mod,bool prime=true) {
  232. VI c;
  233. if(prime) c=BM(a); //素数使用BM
  234. else c=ReedsSloane(a,mod); //合数使用ReedsSloane
  235. c.erase(c.begin());
  236. FOR(i,,SZ(c)-) c[i]=(mod-c[i])%mod;
  237. return solve(n,c,VI(a.begin(),a.begin()+SZ(c)));
  238. }
  239. };
  240.  
  241. ll qpow(ll a,ll b, ll mod)
  242. {
  243. ll res=;
  244. while(b)
  245. {
  246. if(b&) res=res*a%mod;
  247. a=a*a%mod,b>>=;
  248. }
  249. return res;
  250. }
  251.  
  252. vector<ll>tmp;
  253. int n, m;
  254.  
  255. int main()
  256. {
  257. scanf("%d%d", &n,&m);
  258. ll a = , b = , c, sum = ;
  259. tmp.push_back();tmp.push_back();
  260. for(int i = ;i <= *;i++)
  261. {
  262. c = (a + b) % mod;
  263. a = b;
  264. b = c;
  265.  
  266. sum = (sum + qpow(c, m, mod)) % mod;
  267. tmp.push_back(sum);
  268.  
  269. //printf("%lld\n", c);
  270. }
  271.  
  272. //for(int i = 0;i <= 2*m;i++) printf("%lld\n", tmp[i]);
  273. printf("%lld\n", linear_seq::gao(tmp, n, mod, false));
  274.  
  275. }

Code From:https://www.cnblogs.com/Profish/p/9738143.html

BM递推杜教版【扩展】的更多相关文章

  1. BM递推杜教版

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

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

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

  3. 杜教BM递推板子

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

  4. 2019牛客多校第二场BEddy Walker 2——BM递推

    题意 从数字 $0$ 除法,每次向前走 $i$ 步,$i$ 是 $1 \sim K$ 中等概率随机的一个数,也就是说概率都是 $\frac{1}{K}$.求落在过数字 $N$ 额概率,$N=-1$ 表 ...

  5. BM递推

    从别的大佬处看到的模板 #include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f ...

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

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

  7. 牛客多校第九场 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] ...

  8. 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )

    题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...

  9. 【THUSC2017】【LOJ2981】如果奇迹有颜色 DP BM 打表 线性递推

    题目大意 有一个 \(n\) 个点的环,你要用 \(m\) 中颜色染这 \(n\) 个点. 要求连续 \(m\) 个点的颜色不能是 $1 \sim m $ 的排列. 两种环相同当且仅当这两个环可以在旋 ...

随机推荐

  1. 基于DigitalOcean+LAMP+WordPress搭建个人网站

    1. 注册DigitalOcean并新建主机 为了搭建个人网站首先需要一个可以在公网范围访问的主机,可以选用国内如阿里云.国外如DigitalOcean的各种云主机提供商,这里选用DigitalOce ...

  2. Flask源码之:配置加载

    加载配置文件的思路: 1. 读取配置文件中的所有键值对,并将键值对全都放到Config对象.(Config是一个字典,因为它继承了Dict) 2. 把包含所有配置文件的Config对象,赋值给 app ...

  3. 开灯问题—C语言

    开灯问题 有n盏灯,编号为1~n.第1个人把所有灯打开,第2个人按下所有编号为2的倍数开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关,以此类推.一共有k个人,问最后哪些灯是开着?输入n和 ...

  4. centos7中mysql的rpm包安装

    解决依赖 yum remove mysql-libs 执行命令:yum -y install autoconf 安装依赖 yum -y install autoconf 安装mysql rpm -iv ...

  5. U9单据打印模板自定义扩展字段显示名称

    UBF打印模板中,单据自定义扩展字段显示均为扩展字段值集值编码,而在实际运用过程中打印时需要显示扩展字段名称,具体实现方法如下 方式一:采用SQL系统定义函数[dbo].[fn_GetSegName] ...

  6. ubuntu supervisor管理uwsgi+nginx

    一.概述 superviosr是一个Linux/Unix系统上的进程监控工具,他/她upervisor是一个Python开发的通用的进程管理程序,可以管理和监控Linux上面的进程,能将一个普通的命令 ...

  7. 记一次node爬虫经历,手把手教你爬虫

    今天业务突然来了个爬虫业务,爬出来的数据以Excel的形式导出,下班前一个小时开始做,加班一个小时就做好了.因为太久没做爬虫了!做这个需求都是很兴奋! 需求说明 访问网站 (循环)获取页面指定数据源 ...

  8. Parameter 0 of method sqlSessionTemplate in org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration required a single bean, but 2 were found:

    Parameter 0 of method orderSqlSessionFactory in com.config.MultipleDBConfig required a single bean, ...

  9. 2019 魔域java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.魔域等公司offer,岗位是Java后端开发,因为发展原因最终选择去了魔域,入职一年时间了,也成为了面试官,之 ...

  10. 【MySQL】数据库中间件Atlas

    1.介绍 Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改 ...