黑科技之杜教bm
这个板子能够解决任何线性递推式,只要你确定某个数列的某项只与前几项线性相关,那么把它前若干项丢进去,这个板子就能给你返回你要求的某项的值。
原理???(待补充)
- #include<bits/stdc++.h>
- using namespace std;
- #define rep(i,a,n) for (int i=a;i<n;i++)
- #define per(i,a,n) for (int i=n-1;i>=a;i--)
- #define pb push_back
- #define mp make_pair
- #define all(x) (x).begin(),(x).end()
- #define fi first
- #define se second
- #define SZ(x) ((int)(x).size())
- typedef vector<int> VI;
- typedef long long ll;
- typedef pair<int,int> PII;
- const ll mod=;
- 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;}
- ll _,n;
- namespace linear_seq{
- const int N=;
- ll res[N],base[N],_c[N],_md[N];
- vector<ll> Md;
- void mul(ll *a,ll *b,int k)
- {
- rep(i,,k+k) _c[i]=;
- rep(i,,k) if (a[i]) rep(j,,k) _c[i+j]=(_c[i+j]+a[i]*b[j])%mod;
- for (int i=k+k-;i>=k;i--) if (_c[i])
- rep(j,,SZ(Md)) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod;
- rep(i,,k) a[i]=_c[i];
- }
- int solve(ll n,VI a,VI b)
- {
- ll ans=,pnt=;
- int k=SZ(a);
- assert(SZ(a)==SZ(b));
- rep(i,,k) _md[k--i]=-a[i];_md[k]=;
- Md.clear();
- rep(i,,k) if (_md[i]!=) Md.push_back(i);
- rep(i,,k) res[i]=base[i]=;
- res[]=;
- while ((1ll<<pnt)<=n) pnt++;
- for (int p=pnt;p>=;p--)
- {
- mul(res,res,k);
- if ((n>>p)&)
- {
- for (int i=k-;i>=;i--) res[i+]=res[i];res[]=;
- rep(j,,SZ(Md)) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod;
- }
- }
- rep(i,,k) ans=(ans+res[i]*b[i])%mod;
- if (ans<) ans+=mod;
- return ans;
- }
- VI BM(VI s) {
- VI C(,),B(,);
- int L=,m=,b=;
- rep(n,,SZ(s)) {
- ll d=;
- rep(i,,L+) d=(d+(ll)C[i]*s[n-i])%mod;
- if (d==) ++m;
- else if (*L<=n) {
- VI T=C;
- ll c=mod-d*powmod(b,mod-)%mod;
- while (SZ(C)<SZ(B)+m) C.pb();
- rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
- L=n+-L; B=T; b=d; m=;
- } else {
- ll c=mod-d*powmod(b,mod-)%mod;
- while (SZ(C)<SZ(B)+m) C.pb();
- rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
- ++m;
- }
- }
- return C;
- }
- int gao(VI a,ll n){
- VI c=BM(a);
- c.erase(c.begin());
- rep(i,,SZ(c)) c[i]=(mod-c[i])%mod;
- return solve(n,c,VI(a.begin(),a.begin()+SZ(c)));
- }
- };
- int main()
- {
- int t;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%lld",&n);
- vector<int>v;
- v.push_back(); //至少8项,越多越好。
- printf("%lld\n",linear_seq::gao(v,n-)%mod);
- }
- }
黑科技之杜教bm的更多相关文章
- ZZNU 2182 矩阵dp (矩阵快速幂+递推式 || 杜教BM)
题目链接:http://47.93.249.116/problem.php?id=2182 题目描述 河神喜欢吃零食,有三种最喜欢的零食,鱼干,猪肉脯,巧克力.他每小时会选择一种吃一包. 不幸的是,医 ...
- 牛客多校第九场 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] ...
- 杜教BM【转载】
https://blog.csdn.net/qq_36876305/article/details/80275708 #include <bits/stdc++.h> using name ...
- 杜教BM
#include <algorithm> #include <iterator> #include <iostream> #include <cstring& ...
- 杜教BM递推板子
Berlekamp-Massey 算法用于求解常系数线性递推式 #include<bits/stdc++.h> typedef std::vector<int> VI; typ ...
- 杜教BM模板
#include<bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #defi ...
- BM求线性递推模板(杜教版)
BM求线性递推模板(杜教版) BM求线性递推是最近了解到的一个黑科技 如果一个数列.其能够通过线性递推而来 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元 ...
- [自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”
NOW, 步 将此黑科技传授予你~ 一.普通家电控制电路板分析 普通家电,其人机接口一般由按键和指示灯组成(高端的会稍微复杂,这里不考虑) 这样交互过程,其实就是:由当前指示灯信息,按照操作流程按相应 ...
- HDU 6395 Sequence 杜教板子题
题目意思非常明确,就是叫你求第n项,据我们学校一个大佬说他推出了矩阵,但是我是菜鸡,那么肯定是用简单的方法水过啦!我们先p^(1/2)的复杂度处理出i=[i,p]范围内的所有种类的(int)(p/i) ...
随机推荐
- SpringBoot - @ControllerAdvice 处理异常
在Spring 3.2中,新增了@ControllerAdvice.@RestControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@Mode ...
- 【JZOJ6433】【luoguP5664】【CSP-S2019】Emiya 家今天的饭
description analysis 首先可以知道不符合要求的食材仅有一个,于是可以容斥拿总方案数减去选不合法食材的不合法方案数 枚举选取哪一个不合法食材,设\(f[i][j]\)表示到第\(i\ ...
- 表格table隔行变色
if($('.p03-s2').find('table').length >= 2) {$('table:last-child').css({'borderTop': 'none'});}if( ...
- demo BaseDao随笔,hibernate框架
/** * 增加entity * * @param Object对象 * @throws Exception */ public <T> void save(T ob) throws Ex ...
- 2018—2019—2 20165239《网络对抗技术》Exp7 网络欺诈防范
一.原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET工具建立冒名网站 (1分) ettercap DNS ...
- postgreSQL的主外键
--添加主键 alter table cities add PRIMARY KEY(name); --添加外键 alter table weather add FOREIGN key(city) RE ...
- Go语言基础:make,new, len, cap, append, delete方法
前面提到不少Go的内建函数,这篇文章学习下如何使用.. make 先拿 make 开刀,可是一开始我就进入了误区,因为我想先找到他的源码,先是发现 src/builtin/builtin.go 中 ...
- shell重定向的顺序问题
三个默认的文件描述符 0: stdin(标准输入) 1: stdout(标准输出) 2: stderr(标准错误输出) 系统中这3个文件描述符所对应的文件: 重定向顺序 示例脚本 echo " ...
- 1044 Shopping in Mars (25 分)
Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...
- animation和keyframes
animation:name duration timing-function delay iteration-count direction; name:名字 duration: 持续时间 timi ...