2 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=998244353; ll qpow(ll a,ll b){ ll ans=1; for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod; return ans; } int r[600010]; void NTT(ll a[],ll n,ll x){ for(int i=0;i<n;i++)if(i<r[i])swap(a[i],a[r[i]]); for(int m=2;m<=n;m<<=1){ ll g1=qpow(x,n/m); for(int i=0;i<n;i+=m){ ll gk=1; for(int j=0;j<m/2;j++){ ll x=a[i+j],y=a[i+j+m/2]*gk%mod; a[i+j]=(x+y)%mod;a[i+j+m/2]=(x-y+mod)%mod; gk=gk*g1%mod; } } } } ll a[600010],b[600010]; int main(){ ios::sync_with_stdio(0); cin.tie(0); int n; cin>>n; for(int i=0;i<n;i++)cin>>a[n-i-1]>>b[i]; int m=1; while(m<n+n-1)m<<=1; for(int i=0;i<m;i++)r[i]=r[i/2]/2+(i&1)*m/2; ll x=qpow(3,(mod-1)/m); NTT(a,m,x);NTT(b,m,x); for(int i=0;i<m;i++)a[i]=a[i]*b[i]%mod; NTT(a,m,qpow(x,mod-2)); ll invm=qpow(m,mod-2); for(int i=n-1;i>=0;i--){ cout<<a[i]*invm%mod<<'\n'; } return 0; } -
0
#include<cstdio> #include<cmath> using namespace std; template<typename hyy>void swap(hyy &a,hyy &b){hyy c=a;a=b;b=c;} const int N=1<<22; const double Pi=acos(-1); int n,m; struct CP { double x,y; CP (double xx=0,double yy=0){x=xx;y=yy;} CP operator+(CP const&B)const{return CP(x+B.x,y+B.y);} CP operator-(CP const&B)const{return CP(x-B.x,y-B.y);} CP operator*(CP const&B)const{return CP(x*B.x-y*B.y,x*B.y+B.x*y);} }c[N]; int rev[N]; void fft(CP *f,int op) { for(int i=0;i<n;i++)if(i<rev[i])swap(f[i],f[rev[i]]); for(int p=2;p<=n;p<<=1) { int len=p>>1; CP DB(cos(2*Pi/p),sin(2*Pi/p)); DB.y*=op; for(int k=0;k<n;k+=p) { CP buf(1,0); for(int l=k;l<k+len;l++) { CP tmp=buf*f[l+len]; f[l+len]=f[l]-tmp; f[l]=f[l]+tmp; buf=buf*DB; } } } } int main() { scanf("%d",&m);m--;n=m; for(int i=0;i<=m;i++)scanf("%lf%lf",&c[m-i].x,&c[i].y); for(m+=n,n=1;n<=m;n<<=1); for(int i=0;i<n;i++)rev[i]=(rev[i>>1]>>1)|((i&1)?(n>>1):0); fft(c,1); for(int i=0;i<n;i++)c[i]=c[i]*c[i]; fft(c,-1); for(int i=m>>1;i>=0;i--)printf("%d\n",(int)(c[i].y/n/2+0.49999)); return 0; }
- 1
信息
- ID
- 3859
- 时间
- 2000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 2
- 上传者