BM递推杜教版
2024-09-20 20:14:08
#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))
{
/*求第n项*/
printf("%lld\n",linear_seq::gao(VI{,,,,,,,,,, },n-)); /*输出系数*/
/*前k项递推,需要2*k项能确定*/
VI res = linear_seq::BM(VI{,,,,,,,,,, });
for(int i = ;i < res.size();i++) printf("%lld\n", (mod-res[i]) % mod); //f(n) = f(n-1) + 5*f(n-2) + f(n-3) - f(n-4)
}
}
几个测试板子的数据:
Input 1
1 2 4 9 20 40 90 Output 1 0 10 0 Input 2
2 4 8 16 32 64 128 256 512 2 4 8 16 32 64 128 256 512 Output 2
0 0 0 0 0 0 0 1
Code From:
https://blog.csdn.net/qq_36876305/article/details/80275708
https://blog.csdn.net/running_acmer/article/details/82722111
Data From:
https://www.cnblogs.com/zhouzhendong/p/Berlekamp-Massey.html
最新文章
- C代码实现数组
- Unity3D 摄像机的Transform通过摇杆输出的方向
- Nginx内置变量以及日志格式变量参数详解
- Maven - 解决Maven下载依赖包速度慢问题
- java多线程:jdk并发包的总结(转载)
- ExpressionTree——让反射性能向硬编码看齐
- jquery 实现页面拖拽并保存到cookie
- BZOJ2697: 特技飞行
- Less 教程
- JSP和Servlet的区别。
- wordpress显示多个分类的文章
- .net平台是什么?.net平台的组成,.net平台的好处
- 汉字转整数,比系统简单易用!a2iLxx (覆盖物 16十六进制,VC6亲测可用)请提供意见~
- hdu--3782--找规律--xxx定律
- 集群提交spark任务命令
- [国嵌攻略][099][Linux内核配置与编译]
- 跑的飞快的dinic
- Linux中安装nodejs及插件
- AI在汽车中的应用:实用深度学习
- 【转】取模(mod)与取余(rem)的区别——Matlab学习笔记