社区讨论

求助,FFT模板,用NTT超时了

P3803【模板】多项式乘法(FFT)参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mi6x4nac
此快照首次捕获于
2025/11/20 12:15
4 个月前
此快照最后确认于
2025/11/20 12:15
4 个月前
查看原帖
以下是我的代码,求帮助:
JAVA
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.io.InputStream;
import java.io.StringReader;

public class Main
{
    public static void main(String[] args)throws IOException
    {
        Input in=new Input(new BufferedReader(new InputStreamReader(System.in)));
        	PrintWriter out = new PrintWriter(System.out);
        Poly ans=new Poly();
        ans.run(in,out);
        out.close();
    }

    static class Poly
    {
        public static final long mod=998244353;
        public static final long inv2=499122177;
        public static final long g=3;
        static int[] rev=new int[10000000];
        static int l,tt;
        static long inv;
        
        public void run(Input in,PrintWriter out)throws IOException
        {
            int n,m,l=1;
            n=in.nextInt();
            m=in.nextInt();
            while(l<=n+m)l<<=1;
            long a[]=new long[l],b[]=new long[l];
            for(int i=0;i<=n;++i)a[i]=in.nextInt();
            for(int i=0;i<=m;++i)b[i]=in.nextInt();
            a=PolyMul(a,b);
            for(int i=0;i<=n+m;++i)out.print(a[i]+" ");
        }
        
        private long qpow(long a,long b)
        {
            long res=1;
            while(b!=0)
            {
                if((b&1)==1)res=res*a%mod;
                a=a*a%mod;
                b>>=1;
            }
            return res;
        }
        
        private void init(int n)
        {
            l=1;
            tt=0;
            while(l<=n)
            {
                l<<=1;
                ++tt;
            }
        }
        
        private long[] ntt(long a[],int dft)
        {
            for(int i=0;i<l;++i)
            {
                rev[i]=(rev[i>>1]>>1)|((i&1)<<(tt-1));
                if(i<rev[i])
                    {long t=a[i];a[i]=a[rev[i]];a[rev[i]]=t;}
            }
            for(int mid=1;mid<l;mid<<=1)
            {
                long nw=qpow(g,(mod-1)/(mid<<1));
                if(dft==-1)nw=qpow(nw,mod-2);
                for(int r=mid<<1,i=0;i<l;i+=r)
                {
                    long w=1;
                    for(int j=0;j<mid;++j)
                    {
                        long x=a[i+j],y=w*a[i+mid+j]%mod;
                        a[i+j]=(x+y)%mod;
                        a[i+mid+j]=(x-y+mod)%mod;
                        w=w*nw%mod;
                    }
                }
            }
            if(dft==-1)
            {
            	inv=qpow(l,mod-2);
                for(int i=0;i<l;++i)
                    a[i]=a[i]*inv%mod;
            }
            return a;
        }

        private long[] PolyMul(long a[],long b[])
        {
            init(a.length+b.length);
            long[] ta=new long[l],tb=new long[l];
            System.arraycopy(a,0,ta,0,a.length);
            System.arraycopy(b,0,tb,0,b.length);
            ta=ntt(ta,1);
            tb=ntt(tb,1);
            for(int i=0;i<l;++i)ta[i]=ta[i]*tb[i];
            ta=ntt(ta,-1);
            return ta;
        }
    }

    static class Input
    {
        BufferedReader in;
        StringBuilder sb = new StringBuilder();
        public Input(BufferedReader in){this.in = in;}
        public Input(String s){this.in = new BufferedReader(new StringReader(s));}
        public String next()throws IOException
        {sb.setLength(0);while (true){int c=in.read();if(c==-1)return null;if(" \n\r\t".indexOf(c)==-1){sb.append((char)c);break;}}
        while (true){int c=in.read();if(c==-1||" \n\r\t".indexOf(c)!=-1)break;sb.append((char)c);}return sb.toString();}
        public int nextInt()throws IOException{return Integer.parseInt(next());}
    }
}

回复

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

正在加载回复...