奇妙错误求调
查看原帖
奇妙错误求调
244009
TianTian2008楼主2022/11/22 16:15

前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;
}
2022/11/22 16:15
加载中...