蒟蒻再次求助FFT
查看原帖
蒟蒻再次求助FFT
315005
White_gugu楼主2021/8/13 20:48

RT,全部RE

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<complex>
#define co complex<double>
#define pi acos(-1.0)
using namespace std;
int n,m,limt=1;
char ch[1000200];
co a[1000200];
co b[1000200];
int rev[1000200];
int ans[1000200];
void fft(co *c,int inv)
{
	for(int i=0;i<limt;i++)
	if(i<rev[i]) swap(c[rev[i]],c[i]);
	for(int mid=1;mid<limt;mid*=2)
	{
		int len=2*mid;
		co w(cos(pi/mid),inv*sin(pi/mid));
		for(int i=0;i<limt;i+=len)
		{
			co omega(1,0);
			for(int j=0;j<mid;j++)
			{
				co p1=c[i+j],p2=omega*c[i+j+mid];
				c[i+j]=p1+p2;
				c[i+j+mid]=p1-p2;
				omega*=w;
			}
		}
	}
}
int main()
{
	cin>>ch;
	n=strlen(ch)-1;
	for(int i=0;i<=n;i++)
	a[n-i].real()=ch[i]-'0';
	cin>>ch;
	m=strlen(ch)-1;
	for(int i=0;i<=m;i++)
	b[m-i].real()=ch[i]-'0';
	while(limt<n+m+1)
	limt*=2;
	for(int i=0;i<limt;i++)
	if(i&1)
	rev[i]=((rev[i>>1]>>1)+limt/2);
	else
	rev[i]=(rev[i>>1]>>1);
	fft(a,1),fft(b,1);
	for(int i=0;i<limt;i++)
	a[i]*=b[i];
	fft(a,-1);
	for(int i=0;i<limt;i++)
	{
		ans[i]+=(int)(a[i].real()/limt+0.5);
		ans[i+1]=ans[i]/10;
		ans[i]=ans[i]%10;
	}
	int tail=limt;
	while(ans[tail]==0&&tail>-1)
	tail--;
//	printf("%d\n",tail);
	if(tail<0)
	{
		printf("0");
		return 0;
	}
	for(int i=tail;i>=0;i--)
	printf("%d",ans[i]);
//	for(int i=0;i<=n+m;i++)
//	printf("%d ",(int)(a[i].real()/limt+0.5));
}
2021/8/13 20:48
加载中...