社区讨论
跟号算法有机会过这题吗
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 条回复,欢迎继续交流。
正在加载回复...