求助
查看原帖
求助
375242
ynxynx楼主2022/5/2 12:18

蒟蒻第一次写FFT,调炸了

#include<bits/stdc++.h>
using namespace std;
double pie=acos(-1);
typedef complex<double> cp;
char s1[3000001],s2[3000001];
cp a[3000001],b[3000001];
int n,ans[3000001],rev[3000001];
void init(int k){
    int len=1<<k;
	for(int i=0;i<len;i++)
	rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
}
void FFT(cp *a,int n,int f){
	for (int i=0;i<n;i++) {
		if (i<rev[i]) swap(a[i],a[rev[i]]);
	}
	for (int h=1;h<n;h<<=1) {
		cp wn=exp(cp(0,f*pie/h));
		for (int j=0;j<n;j+=(h*2)) {
			cp w(1,0);
			for (int k=j;k<j+h;k++) {
			    cp x=a[k];
			    cp y=w*a[k+h];
		        a[k]=x+y; 
		        a[k+h]=x-y;
		        w*=wn; 
			}
		}
	}
	if(f==-1) for(int i=0;i<n;i++) a[i]/=n;
}
int main(){
	scanf("%s %s",s1,s2);
	n=max(strlen(s1),strlen(s2));
	for (int i=0;i<n;i++) {
		a[i]=double(s1[n-i-1]-'0');
		b[i]=double(s2[n-i-1]-'0');
	}
	int k=1,s=2;
	while ((1<<k)<(n*2-1)) k++,s=s<<1;
	init(k);
	FFT(a,s,1);
	FFT(b,s,1);
	for (int i=0;i<s;i++) {
		a[i]=a[i]*b[i];
	}
	FFT(a,s,-1);
	for (int i=0;i<s;i++) {
		ans[i]+=(int)(a[i].real()+0.5);
		ans[i+1]+=ans[i]/10;
		ans[i]%=10;
	}
	while (ans[s]==0&&s>-1) s--;
	if (s==-1) {
		printf("0");
		return 0;
	}
	for (int i=s;i>=0;i--) printf("%d ",ans[i]);
}

大佬帮忙谢谢

2022/5/2 12:18
加载中...