前3个数据点a了,后面的全部wa掉
下载了第4个数据点,发现前18937个答案是对的,后面开始就错了
有没有大佬帮忙调一下QWQ
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
typedef double db;
ll n,rev[500001];
db a[100001],b[100001],pi=acos(-1);
struct cplx
{
db a,b;
cplx(db x=0,db y=0){a=x;b=y;}
friend cplx operator +(cplx c1,cplx c2){return cplx(c1.a+c2.a,c1.b+c2.b);}
friend cplx operator -(cplx c1,cplx c2){return cplx(c1.a-c2.a,c1.b-c2.b);}
friend cplx operator *(cplx c1,cplx c2){return cplx(c1.a*c2.a-c1.b*c2.b,c1.a*c2.b+c1.b*c2.a);}
}f[500001],g1[500001],g2[500001];
inline ll getlen(ll n) {
ll res=1;
while(res<n) res<<=1;
return res;
}
void fft(ll n,cplx* f,ll typ) {
for(int i=0;i<n;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?n>>1:0);
for(int i=0;i<n;++i)
if(rev[i]<i) swap(f[rev[i]],f[i]);
for(int mid=1;mid<n;mid<<=1) {
ll len=mid<<1;
cplx omg=cplx(cos(pi*2/len),typ*sin(pi*2/len));
for(int s=0;s<n;s+=len) {
cplx cur=cplx(1,0);
for(int i=0;i<mid;++i) {
cplx c1=f[s+i],c2=cur*f[s+i+mid];
f[s+i]=c1+c2;
f[s+i+mid]=c1-c2;
cur=cur*omg;
}
}
}
}
int main() {
scanf("%lld",&n);
for(ll i=1;i<=n;++i) {
f[i].a=1/(db)(i*i);
scanf("%lf",&g1[i].a);
g2[n-i].a=g1[i].a;
}
ll m=getlen(n<<1|1);
fft(m,f,1);
fft(m,g1,1);
fft(m,g2,1);
for(int i=0;i<m;++i) {
g1[i]=f[i]*g1[i];
g2[i]=f[i]*g2[i];
}
fft(m,g1,-1);
fft(m,g2,-1);
for(int i=0;i<m;++i) {
a[i]=g1[i].a/m;
b[i]=g2[i].a/m;
}
for(int i=1;i<=n;++i) printf("%.5lf\n",a[i]-b[n-i]);
return 0;
}