自己实现的。。不知道错在哪里。。求dalao

P4245 【模板】任意模数多项式乘法

steven张 @ 2018-03-06 08:44:06

网上没找到什么资料。。试着(瞎)写了一下。。然后就全WA了。。感觉fft最后取模有点不太对劲

include<bits/stdc++.h>

define maxn 200010

using namespace std; const double PI=acos(-1); int n,m,p; int x[maxn],y[maxn]; struct Com{ double x,y; Com(double x=0,double y=0):x(x),y(y) {} }a[maxn],b[maxn],c[maxn],d[maxn],ac[maxn],ad[maxn],bc[maxn],bd[maxn]; long long ans1[maxn],ans2[maxn],ans3[maxn],ans[maxn]; Com operator+(const Com &a,const Com &b){return Com(a.x+b.x,a.y+b.y);} Com operator-(const Com &a,const Com &b){return Com(a.x-b.x,a.y-b.y);} Com operator(const Com &a,const Com &b){return Com(a.xb.x-a.yb.y,a.xb.y+a.yb.x);} void FFT(Com A,int f,int k){ for(int i=0,j=0;i<k;i++){ if(i>j)swap(a[i],a[j]); for(int l=k>>1;(j^=l)<l;l>>=1); } for(int i=1;i<k;i<<=1){Com w(cos(PI/i),fsin(PI/i)); for(int j=0;j<k;j+=i<<1){Com e(1,0); for(int l=0;l<i;l++,e=ew){Com x,y; x=A[j+l];y=A[j+l+i]*e; A[j+l]=x+y;A[j+l+i]=x-y; } } } if(f==-1)for(int i=0;i<k;i++)a[i].x/=k; } int main(){

scanf("%d%d%d",&n,&m,&p);
for(int i=0;i<=n;i++)scanf("%d",&x[i]);
for(int i=0;i<=m;i++)scanf("%d",&y[i]);
for(int i=0;i<=n;i++)a[i].x=(double)(x[i]>>15);
for(int i=0;i<=m;i++)b[i].x=(double)(x[i]&32767);
for(int i=0;i<=n;i++)c[i].x=(double)(y[i]>>15);
for(int i=0;i<=m;i++)d[i].x=(double)(y[i]&32767);
n+=m;int k;
for(k=1;k<=n;k<<=1);
FFT(a,1,k);FFT(b,1,k);FFT(c,1,k);FFT(d,1,k);
for(int i=0;i<k;i++)ac[i]=a[i]*c[i];
for(int i=0;i<k;i++)ad[i]=a[i]*d[i];
for(int i=0;i<k;i++)bc[i]=b[i]*c[i];
for(int i=0;i<k;i++)bd[i]=b[i]*d[i];
FFT(ac,-1,k);FFT(ad,-1,k);FFT(bc,-1,k);FFT(bd,-1,k);
for(int i=0;i<k;i++)ans1[i]=(long long)(ac[i].x+0.5)%p;
for(int i=0;i<k;i++)ans2[i]=((long long)(bc[i].x+0.5)%p+(long long)(ad[i].x+0.5)%p)%p;
for(int i=0;i<k;i++)ans3[i]=(long long)(bd[i].x+0.5)%p;
for(int i=0;i<k;i++)ans[i]=(((ans1[i]*32768*32768)%p+ans2[i]*32768)%p+ans3[i])%p;
for(int i=0;i<=n;i++)printf("%lld ",ans[i]);
return 0;

}

多项式学的特别迷Orz


by panda_2134 @ 2018-03-06 12:52:29

讲道理这个题比较卡精度,要用long double...
不过不用也不应该全部wa啊...


by steven张 @ 2018-03-06 22:42:03

我感觉是我实现方向上出了偏差Orz。。dalao有没有正确代码。。主要是没百度到 @panda_2134


by panda_2134 @ 2018-03-07 08:27:17

@steven张 我fa个题解吧qwq


by steven张 @ 2018-03-07 09:15:32

%%%%%%%%dalao太强了


by steven张 @ 2018-03-07 09:15:48

@panda_2134


|