@lychee123
2017-09-06T20:30:51.000000Z
字数 888
阅读 948
数论
#include<bits/stdc++.h>
using namespace std;
#define ld double
const int SZ=1e5;
int n;
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(1);
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.push_back(-k);
for(int j=0; j<ls.size(); j++) cur.push_back(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++)
printf("%f ",ps[pn][g]);
return 0;
}
用法举例
已知前项为
对于代码输入,然后输入这就个数
跑出来的结果为
表示当前项与前四项相关。
推出公式为