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

  • 相关阅读:
    IntelliJ IDEA 14.03 java 中文文本处理中的编码格式设置
    应聘感悟
    STL string分析
    CUDA SDK VolumeRender 分析 (1)
    BSP
    CUDA SDK VolumeRender 分析 (3)
    CUDA SDK VolumeRender 分析 (2)
    Windows软件发布时遇到的一些问题
    Ten Commandments of Egoless Programming (转载)
    复习下光照知识
  • 原文地址:https://www.cnblogs.com/lfri/p/11520890.html
Copyright © 2011-2022 走看看