2 条题解

  • 0
    @ 2026-2-27 15:48:25
    #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
      @ 2025-10-8 17:05:33
      #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
      上传者