社区讨论

求救,本蒟蒻改的心力憔悴了

P5205【模板】多项式开根参与者 3已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mi7wog73
此快照首次捕获于
2025/11/21 04:50
4 个月前
此快照最后确认于
2025/11/21 04:50
4 个月前
查看原帖
CPP
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define fr(i,a,b) for(int i=(a),_end_=(b);i<=_end_;i++)
#define fd(i,a,b) for(int i=(a),_end_=(b);i>=_end_;i--)
int read()
{
	int r=0,t=1,c=getchar();
	while(c<'0'||c>'9')
	{
		t=c=='-'?-1:1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		r=(r<<3)+(r<<1)+(c^48);
		c=getchar();
	}
	return r*t;
}
#define N (1<<21)+10
namespace withoutmod
{
	long long p[N],l;
	struct comp
	{
		double a,b;//a+bi
		comp(double _a=0.,double _b=0.)
		{
			a=_a;
			b=_b;
		}
		comp operator+(comp x)
		{
			x.a+=a;
			x.b+=b;
			return x;
		}
		comp operator-(comp x)
		{
			x.a=a-x.a;
			x.b=b-x.b;
			return x;
		}
		comp operator*(comp x)
		{
			comp r;
			r.a=a*x.a-b*x.b;
			r.b=a*x.b+b*x.a;
			return r;
		}
		comp operator*=(comp x)
		{
			return *this=*this*x;
		}
	};
	comp _a[N],_b[N],_c[N];
	void init(long long n)
	{
		l=0;
		while((1<<l)<n)
			l++;
		fr(i,0,(1<<l)-1)
			p[i]=(p[i>>1]>>1)|((i&1)<<(l-1));
	}
	void FFT(comp *a,long long opt)
	{
		double pi=acos(-1.);
		fr(i,0,(1<<l)-1)
			if(i<p[i])
				swap(a[i],a[p[i]]);
		fr(i,0,l-1)
		{
			comp wn=comp(cos(pi/(1<<i)),opt*sin(pi/(1<<i)));
			for(long long j=0;j<(1<<l);j+=(1<<(i+1)))
			{
				comp w=comp(1,0);
				fr(k,0,(1<<i)-1)
				{
					comp x=a[j+k],y=w*a[j+k+(1<<i)];
					a[j+k]=x+y;
					a[j+k+(1<<i)]=x-y;
					w*=wn;
				}
			}
		}
		if(opt==-1)
		{
			fr(i,0,(1<<l)-1)
			{
				a[i].a/=(1<<l)*1.;
				a[i].b/=(1<<l)*1.;
			}
		}
	}
	void times(long long *c,long long *a,long long *b,long long n,long long m)
	{
		init(n+m+1);
		fr(i,0,(1<<l)-1)
			_a[i]=_b[i]=comp(0,0);
		fr(i,0,n)
			_a[i].a=a[i]*1.;
		fr(i,0,m)
			_b[i].a=b[i]*1.;
		FFT(_a,1);
		FFT(_b,1);
		fr(i,0,(1<<l)-1)
			_c[i]=_a[i]*_b[i];
		FFT(_c,-1);
		fr(i,0,n+m)
			c[i]=(long long)(_c[i].a+0.5);
	}
}
#include<stdlib.h>
namespace withmod
{
	const long long mod=998244353,g=3,_g=332748118;
	long long l,p[N];
	long long _a[N],_b[N],_c[N];
	long long power(long long a,long long b,long long m)
	{
		long long r=1;
		a%=m;
		while(b)
		{
			if(b&1)
				r=r*a%m;
			a=a*a%m;
			b>>=1;
		}
		return r;
	}
	void init(long long n)
	{
		l=0;
		while((1<<l)<n)
			l++;
		fr(i,0,(1<<l)-1)
			p[i]=(p[i>>1]>>1)|((i&1)<<(l-1));
	}
	void NTT(long long *a,long long opt)
	{
		fr(i,0,(1<<l)-1)
			if(i<p[i])
				swap(a[i],a[p[i]]);
		fr(i,0,l-1)
		{
			long long wn=power(opt==1?g:_g,(mod-1)/(1<<(i+1)),mod);
			for(long long j=0;j<(1<<l);j+=(1<<(i+1)))
			{
				long long w=1;
				fr(k,0,(1<<i)-1)
				{
					long long x=a[j+k],y=w*a[j+k+(1<<i)]%mod;
					a[j+k]=(x+y)%mod;
					a[j+k+(1<<i)]=(x-y+mod)%mod;
					w=w*wn%mod;
				}
			}
		}
		if(opt==-1)
		{
			long long i=power(1<<l,mod-2,mod);
			fr(j,0,(1<<l)-1)
				a[j]=a[j]*i%mod;
		}
	}
	void times(long long *c,long long *a,long long *b,long long n,long long m)
	{
		init(n+m+1);
		fr(i,0,(1<<l)-1)
			_a[i]=_b[i]=0;
		fr(i,0,n)
			_a[i]=a[i];
		fr(i,0,m)
			_b[i]=b[i];
		NTT(_a,1);
		NTT(_b,1);
		fr(i,0,(1<<l)-1)
			_c[i]=_a[i]*_b[i]%mod;
		NTT(_c,-1);
		fr(i,0,n+m)
			c[i]=_c[i];
	}
	long long _d[N];
	void inv(long long *c,long long *a,long long p)
	{
		if(p==1)
		{
			c[0]=power(a[0],mod-2,mod);
			return;
		}
		inv(c,a,(p+1)/2);
		times(_d,a,c,p-1,p-1);
		fr(i,p,p+p-2)
			_d[i]=0;
		fr(i,1,p-1)
			_d[i]=mod-_d[i];
		_d[0]=(2+mod-_d[0])%mod;
		times(c,_d,c,p-1,p-1);
		fr(i,p,p+p-2)
			c[i]=0;
	}
	struct simcomp
	{
		long long a,b,x;//a+b sqrt(x)
		simcomp(long long _a=0,long long _b=0,long long _x=0)
		{
			a=_a;
			b=_b;
			x=_x;
		}
		simcomp operator*(simcomp c)
		{
			return x==c.x?simcomp((a*c.a+b*c.b%mod*x)%mod,(a*c.b+b*c.a)%mod,x):-1;
		}
		simcomp operator*=(simcomp c)
		{
			return *this=*this*c;
		}
	};
	long long sqrt_mod(long long k)
	{
		if(k==0)
			return 0;
		srand((unsigned long long)new char);
		if(power(k,(mod-1)/2,mod)!=1)
			return -1;
		long long a=rand()%mod;
		while(power(a*a-k+mod,(mod-1)/2,mod)==1)
			a=rand()%mod;
		simcomp x=simcomp(a,1,(a*a-k+mod)%mod),y;
		y=x;
		long long p=(mod-1)/2;
		while(p)
		{
			if(p&1)
				y*=x;
			x*=x;
			p>>=1;
		}
		return y.a;
	}
	void sqrt(long long *c,long long *a,long long p)
	{
		if(p==1)
		{
			c[0]=sqrt_mod(a[0]);
			if(c[0]==-1)
				exit(-1);
			if(c[0]>mod-c[0])//Fuck the sb:luogu5205!
				c[0]=mod-c[0];
			return;
		}
		sqrt(c,a,(p+1)/2);
		fr(i,0,p-1)
			_d[i]=0;
		inv(_d,c,p);
		times(_d,a,_d,p-1,p-1);
		fr(i,p,p+p-2)
			_d[i]=0;
		long long p2=power(2,mod-2,mod);
		fr(i,0,p-1)
			c[i]=(c[i]+_d[i])*p2%mod;
	}
}
long long a[N],b[N],n;
int main()
{
	n=read()-1;
	fr(i,0,n)
		a[i]=read();
	withmod::sqrt(b,a,n+1);
	fr(i,0,n)
		printf("%lld%c",b[i],i==n?'\n':' ');
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...