杜教BM【转载】
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i,a,n) for (long long i=a;i<n;i++)
- #define per(i,a,n) for (long long 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) ((long long)(x).size())
- typedef vector<long long> VI;
- typedef long long ll;
- typedef pair<long long,long long> PII;
- const ll mod=1e9+;
- 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;}
- // head
- long long _,n;
- namespace linear_seq
- {
- const long long N=;
- ll res[N],base[N],_c[N],_md[N];
- vector<long long> Md;
- void mul(ll *a,ll *b,long long 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 (long long 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];
- }
- long long solve(ll n,VI a,VI b)
- { // a 系数 b 初值 b[n+1]=a[0]*b[n]+...
- // printf("%d\n",SZ(b));
- ll ans=,pnt=;
- long long 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 (long long p=pnt;p>=;p--)
- {
- mul(res,res,k);
- if ((n>>p)&)
- {
- for (long long 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(,);
- long long 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;
- }
- long long 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()
- {
- while(~scanf("%I64d", &n))
- { printf("%I64d\n",linear_seq::gao(VI{,,,,,,,,,, },n-));
- }
- }
杜教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
#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
这个板子能够解决任何线性递推式,只要你确定某个数列的某项只与前几项线性相关,那么把它前若干项丢进去,这个板子就能给你返回你要求的某项的值. 原理???(待补充) #include<bits/st ...
- BM求线性递推模板(杜教版)
BM求线性递推模板(杜教版) BM求线性递推是最近了解到的一个黑科技 如果一个数列.其能够通过线性递推而来 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元 ...
- HDU 6395 Sequence 杜教板子题
题目意思非常明确,就是叫你求第n项,据我们学校一个大佬说他推出了矩阵,但是我是菜鸡,那么肯定是用简单的方法水过啦!我们先p^(1/2)的复杂度处理出i=[i,p]范围内的所有种类的(int)(p/i) ...
- bzoj 4176: Lucas的数论 -- 杜教筛,莫比乌斯反演
4176: Lucas的数论 Time Limit: 30 Sec Memory Limit: 256 MB Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么 ...
随机推荐
- 改变Cube的Shader下的Alpha值,实现Cube若隐若现的效果。
private float rotaSpeed = 5f; private float timer = 1; private bool flag = true; private float delay ...
- bzoj3412
题解: 先把询问排序 然后根据单调性来做 代码: #include<bits/stdc++.h> using namespace std; ],b[],f[],ans[]; int cmp ...
- 【转载】 unity 塔防游戏
原文地址: Part1的地址:http://www.cnblogs.com/lcxBlog/p/6075984.html Part2的地址:http://www.cnblogs.com/lcxBlog ...
- nginx启用php
1. php下载https://secure.php.net/downloads.php搜索china镜像站点,从这里下载http://cn2.php.net/get/php-7.2.3.tar.gz ...
- 协程(Coroutine)与多线程,多进程
执行多个任务可以使用多线程或多进程. 多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响 多线程中,所有变量都由所有线程共享.而线程间的切换是系统进行调度,无法控制,所以可能 一个进程中的 ...
- npm login npm publish报错
. 把那个文件删除就好了 查看npm是淘宝的还是原始的 npm config get registry 如果是淘宝的要退回到原始的 npm config set registry=http://reg ...
- Chrome浏览器录屏扩展插件
Chrome浏览器录屏扩展插件,可以录制网页操作或者桌面操作.生成MP4 Loom https://chrome.google.com/webstore/detail/loom-video-recor ...
- restful接口设计规范总结
这篇 文章主要是借鉴他人,但是自己很想总结出一套规范,以供向我这样的新手使用,用来规范代码,如果有什么好的提议,请不吝赐教,本篇文章长期更新! 一.重要概念: REST,即Representation ...
- golang统计出其中英文字母、空格、数字和其它字符的个数
方法一 通过ASCII码表判断并统计 package main import "fmt" func charactortype() { var s2 string = " ...
- mysql三范式
第一范式:有主键,具有原子性,字段不可分割. 第二范式:完全依赖,没有部分依赖. 第三范式:没有传递依赖. 总结:数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时候会拿冗余还速度,最总用的 ...