总算是弄懂了一点点 F F T FFT FFT

但是那个蝴蝶操作还只是背的板子呜呜

先放个优化高精度乘法的板子在这里把

​P3803 【模板】多项式乘法(FFT)​

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=5e6+10;
const double PI = acos(-1.0);
char s1[maxn],s2[maxn];
struct complex
{
double x,y;
complex(double xx=0,double yy=0){ x=xx,y=yy; }
}a[maxn],b[maxn];
complex operator + (complex a,complex b){ return complex(a.x+b.x,a.y+b.y);}
complex operator - (complex a,complex b){ return complex(a.x-b.x,a.y-b.y);}
complex operator * (complex a,complex b){ return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
int n,m,l,r[maxn],limit=1,ans[maxn];
void FFT(complex *a,int type )
{
for(int i=0;i<limit;i++)
if( i<r[i] ) swap(a[i],a[r[i]]);
for(int mid=1;mid<limit;mid<<=1)//每个小区间的中点
{
complex wn( cos(PI/mid),type*sin(PI/mid) );
for(int R=mid<<1,j=0;j<limit;j+=R)//每个区间地开头是j
{
complex w(1,0);
for(int k=0;k<mid;k++,w = w*wn)//每个区间的左半部分k+j
{
complex x=a[j+k],y=a[j+mid+k]*w;
a[j+k]=x+y;
a[j+mid+k]=x-y;
}
}
}
}
int main()
{
scanf("%s%s",s1,s2);
int n=strlen(s1),m=strlen(s2);
for(int i=n-1;i>=0;i--) a[n-i-1].x = s1[i]-'0';
for(int i=m-1;i>=0;i--) b[m-i-1].x = s2[i]-'0';
while( limit<=n+m-2 ) limit<<=1,l++;
for(int i=0;i<=limit;i++)
r[i] = (r[i>>1]>>1 )|( (i&1)<<(l-1) );
FFT(a,1);
FFT(b,1);
for(int i=0;i<=limit;i++) a[i] = a[i]*b[i];
FFT(a,-1);
for(int i=0;i<=limit;i++)
{
ans[i] += (int)( a[i].x/limit +0.5 );
if( ans[i] >= 10 )
ans[i+1]+=ans[i]/10,ans[i]%=10,limit+=(i==limit);
}
while( !ans[limit]&&limit ) limit--;
for(int i=limit;i>=0;i--) cout << ans[i];
return 0;
}

`