社区讨论
求救,本蒟蒻改的心力憔悴了
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 条回复,欢迎继续交流。
正在加载回复...