多项式分治法

暴力乘法虽然简单时间复杂度太高,对于序列型问题,并且变化规则相同(都是乘法)我们考虑分治,准确的说是0.5倍增,其主体思想是减少乘法的次数,和

stressen矩阵乘法一样,对式子进行变形:(ax^m+b)(cx^m+d)=acx^m+((a+b)(c+d)-ac-bd)x^m+bd,其中进行三次乘法,复杂度在n……1.6左右,虽然不如fft,但思想值得借鉴:贴上自己丑陋的伪代码(未调试),以后完善:#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1002;
struct node{ int x[maxn];};
node a,b;
int n,m,l;
void init(){
scanf("%d%d",&n,&m);
for (int i=0;i<=n;i++) scanf("%d",&a.x[i]);
for (int i=0;i<=m;i++) scanf("%d",&b.x[i]);
}


node mul1(node p,node q,l){
node a,b,c,d,res1,res2,res3,res;
memset(res.x,sizeof(res.x))
for (int i=0;i<l/2;i++) { b.x[i]=p.x[i]; d.x[i]=q.x[i];}
for (int i=l/2;i<=l;i++) { a.x[i]=p.x[i-l>>1]; c.x[i]=q.x[i-l>>1];}
res1=mul1(a,b,l-l>>1); res2=mul1(b,d,l>>1-1);
for (int i=0;i<=l;i++) res.x[i+(l>>1)<<1]+=res1.x[i];
for (int i=0;i<=l;i++) res.x[i]+=res2.x[i];
res3=mul3(mul1(mul2(a,b,(l+2)>>1),mul2(c,d,(l+2)>>1),(l+2)>>1),mul2(res1,res2,l+2),l+2);
for (int i=0;i<=l;i++) res.x[i+l>>1]+=res3.x[i];
return res;
}


void print(){
for (int i=0;i<=n+m;i++) printf("%d ",ans.x[i]);
}
int main(){
init();
node ans=mul1(a,b,max(n,m));
print();
return 0;
}

你可能感兴趣的:(多项式分治法)