zoukankan      html  css  js  c++  java
  • BM算法【实数模板】

    BM递推杜教版是在整数取模的情况下的,

    这个可以求解实数系数,但是可能有精度误差。

    若一个问题的结论是通过推线性递推式来解,考虑到实际的情况,可以用BM算法的模板,先输入项数再依次输入项,项越多越准确(按道理,前k项的递推,只需要2*k 个初始项就能确定)

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i,a,b) for(int i=int(a);i<int(b);++i)
    #define mem(a,p) memset(a,p,sizeof(a))
    #define MAXN 1005
    
    struct BM
    {
        int n{};
    
        vector<double> ps[MAXN];
        int pn{},fail[MAXN]{};
        double delta[MAXN]{};
    
        void Solve(const double *x,int n)
        {
            pn=0;
            mem(fail,0);
            mem(delta,0);
            ps[0].clear();
            rep(i,1,n+1)
            {
                double dt=-x[i];
                rep(j,0,ps[pn].size())
                    dt+=x[i-j-1]*ps[pn][j];
                delta[i]=dt;
                if(fabs(dt)<=1e-8)continue;
                fail[pn]=i;
                if(!pn)
                {
                    ps[++pn].resize(1);
                    continue;
                }
                vector<double> &ls=ps[pn-1];
                double k=-dt/delta[fail[pn-1]];
                vector<double> cur;
                cur.resize(i-fail[pn-1]-1);
                cur.push_back(-k);
                rep(j,0,ls.size())cur.push_back(ls[j]*k);
                if(cur.size()<ps[pn].size())cur.resize(ps[pn].size());
                rep(j,0,ps[pn].size())cur[j]+=ps[pn][j];
                ps[++pn]=cur;
            }
        }
    
        void print()
        {
            cout<<setiosflags(ios::fixed)<<setprecision(10);
            for(int i = 0;i<ps[pn].size();++i)
            {
                cout<<ps[pn][i]<<" ";
            }
            cout<<endl;
        }
    }B;
    
    double x[MAXN];
    
    int main()
    {
        int n;
        while(cin>>n)
        {
            for(int i = 1;i<=n;++i)
            {
                cin>>x[i];
            }
            B.Solve(x,n);
            B.print();
        }
    }

    Code From:

    https://www.haoyuan.info/?p=300

  • 相关阅读:
    C#托盘图标
    线程相关整理
    Quartz.NET 快速入门
    (转)IE内存泄露,iframe内存泄露造成的原因和解决方案
    美化console.log的文本(转载)
    mongoDB学习资料整理
    EF7学习资料整理
    Oracle常用
    Node.js学习资料整理
    【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器(转)
  • 原文地址:https://www.cnblogs.com/lfri/p/11520890.html
Copyright © 2011-2022 走看看