社区讨论

跟号算法有机会过这题吗

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@lo2dtju4
此快照首次捕获于
2023/10/23 12:12
2 年前
此快照最后确认于
2023/11/03 12:19
2 年前
查看原帖
我的代码如下:
CPP
#include"bits/stdc++.h"
const double Pi = acos(-1);
using namespace std;

int read () 
{ 
	int x = 0;
	char c = getchar();
	while(c<'0'||c>'9'){
		c = getchar();
	}
	while(c>='0'&&c<='9'){
		x = x*10+c-'0';
		c = getchar();
	}
	return x;
}

struct Complex
{
    Complex (double xx=0,double yy=0){x=xx,y=yy;}
    double x,y;
    Complex operator + (Complex const &B) const
    {return Complex(x+B.x,y+B.y);}
    Complex operator - (Complex const &B) const
    {return Complex(x-B.x,y-B.y);}
    Complex operator * (Complex const &B) const
    {return Complex(x*B.x-y*B.y,x*B.y+y*B.x);}
};

const int maxn = 2e6+5;
//f[0] = (Poly) poly -> fp
//f[1] = (Result of DFT) points on original -> fr
//f[2] = points on sqrt decomp -> fs 
Complex f[3][maxn];
Complex g[3][maxn];

//w^n = 1
Complex w[maxn];

void FFT (Complex (&poly)[3][maxn], int n, bool DFT) 
{
    const int sqr = sqrt(n);
    Complex r = Complex(cos(2*Pi/n),sin(2*Pi/n));
    if (!DFT) r.y *= -1;
    w[0] = Complex(1,0);
    for (int i=1;i<=sqr*sqr;i++) w[i] = w[i-1]*r;
    for (int i=0;i<sqr;i++) 
    {
        for (int k=0;k<sqr;k++) 
        {
            Complex x = Complex(1,0);
            for (int j=0;j<sqr;j++)
            {
                poly[2][i*sqr+k] = poly[2][i*sqr+k]+x*poly[0][j*sqr+i];
                x = x*w[k*sqr];
            }
        }
    }
    for (int k=0;k<sqr;k++)  
    {
        for (int j=0;j<sqr;j++) 
        {
            Complex x = Complex(1,0);
            for (int i=0;i<sqr;i++) 
            {
                poly[1][k+sqr*j] = poly[1][k+j*sqr]+x*poly[2][i*sqr+k];
                x = x*w[k+sqr*j];
            }
        }
    }
    swap(poly[1],poly[0]);
    memset(poly[1],0,sizeof(poly[1]));
    memset(poly[2],0,sizeof(poly[2]));
}

int main ()
{
    int n = read();
    int m = read();
    for (int i=0;i<=n;i++) f[0][i].x = read();
    for (int i=0;i<=m;i++) g[0][i].x = read();
    int d = m+n;
    n = ((int)sqrt(n+m+2)+1)*((int)sqrt(n+m+2)+1);
    FFT(f,n,1);FFT(g,n,1);
    for (int i=0;i<=n;i++) f[0][i] = f[0][i]*g[0][i];
    FFT(f,n,0);
    for (int i=0;i<=d;i++) printf("%d ",(int)(f[0][i].x/n+0.49));
}

回复

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

正在加载回复...