2018-team4-modules/BM
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
#define SZ 10010
int n;
typedef double ld;
typedef vector<ld> vld;
vld ps[2333];
int pn = 0, fail[SZ];
ld x[SZ], delta[SZ];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lf", x + i);
for (int i = 1; i <= n; i++)
{
ld dt = -x[i];
for (int j = 0; j < ps[pn].size(); j++)
dt += x[i - j - 1] * ps[pn][j];
delta[i] = dt;
if (fabs(dt) <= 1e-7)
continue;
fail[pn] = i;
if (!pn)
{
ps[++pn].resize(i);
continue;
}
vld &ls = ps[pn - 1];
ld k = -dt / delta[fail[pn - 1]];
vld cur;
cur.resize(i - fail[pn - 1] - 1); //trailing 0
cur.pb(-k);
for (int j = 0; j < ls.size(); j++)
cur.pb(ls[j] * k);
if (cur.size() < ps[pn].size())
cur.resize(ps[pn].size());
for (int j = 0; j < ps[pn].size(); j++)
cur[j] += ps[pn][j];
ps[++pn] = cur;
}
for (unsigned g = 0; g < ps[pn].size(); g++)
cout << ps[pn][g] << " ";
puts("");
}
}}}
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
#define SZ 10010
int n;
typedef double ld;
typedef vector<ld> vld;
vld ps[2333];
int pn = 0, fail[SZ];
ld x[SZ], delta[SZ];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lf", x + i);
for (int i = 1; i <= n; i++)
{
ld dt = -x[i];
for (int j = 0; j < ps[pn].size(); j++)
dt += x[i - j - 1] * ps[pn][j];
delta[i] = dt;
if (fabs(dt) <= 1e-7)
continue;
fail[pn] = i;
if (!pn)
{
ps[++pn].resize(i);
continue;
}
vld &ls = ps[pn - 1];
ld k = -dt / delta[fail[pn - 1]];
vld cur;
cur.resize(i - fail[pn - 1] - 1); //trailing 0
cur.pb(-k);
for (int j = 0; j < ls.size(); j++)
cur.pb(ls[j] * k);
if (cur.size() < ps[pn].size())
cur.resize(ps[pn].size());
for (int j = 0; j < ps[pn].size(); j++)
cur[j] += ps[pn][j];
ps[++pn] = cur;
}
for (unsigned g = 0; g < ps[pn].size(); g++)
cout << ps[pn][g] << " ";
puts("");
}