RE,果然我不适合写FFT吗
查看原帖
RE,果然我不适合写FFT吗
188769
Vanilla_chan楼主2020/11/29 20:23

调了半天fft发现是顺序的问题。突然发现fft还是很符合高精度的顺序的。终于调完了以后发现全RE了,全 R E 了……

先不在意常数啥的吧……

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
#define LL long long
#define ULL unsigned long long
#ifdef TH
#define debug printf("Now is %d\n",__LINE__);
#else
#define debug
#endif
using namespace std;

template<class T>inline void read(T&x)
{
	char ch=getchar();
	int fu;
	while(!isdigit(ch)&&ch!='-') ch=getchar();
	if(ch=='-') fu=-1,ch=getchar();
	x=ch-'0';ch=getchar();
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	x*=fu;
}
inline int read()
{
	int x=0,fu=1;
	char ch=getchar();
	while(!isdigit(ch)&&ch!='-') ch=getchar();
	if(ch=='-') fu=-1,ch=getchar();
	x=ch-'0';ch=getchar();
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	return x*fu;
}
int G[55];
template<class T>inline void write(T x)
{
	int g=0;
	if(x<0) x=-x,putchar('-');
	do{G[++g]=x%10;x/=10;}while(x);
	for(int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
const double Pi = acos(-1.0);
string str1,str2;
struct complex
{
	double x,y;
	complex(double xx=0,double yy=0){x=xx,y=yy;}
	complex operator+(complex z){return complex(x+z.x,y+z.y);}
	complex operator-(complex z){return complex(x-z.x,y-z.y);}
	complex operator*(complex z){return complex(x*z.x-y*z.y,y*z.x+x*z.y);}
};
vector<complex>fft(vector<complex>a,int type)
{
	if(a.size()==1) return a;
	vector<complex>a1,a2;
	for(unsigned int i=0;i<a.size();i+=2) a1.push_back(a[i]),a2.push_back(a[i+1]);
	a1=fft(a1,type);
	a2=fft(a2,type);
	complex w=complex(1,0),Wn=complex(cos(2*Pi/a.size()),type*sin(2*Pi/a.size())),t;
	for(int i=0;i<a.size()/2;i++,w=w*Wn)
	{
		t=w*a2[i];
		a[i]=a1[i]+t;
		a[i+a.size()/2]=a1[i]-t;
	}
	return a;
}
vector<complex>a;
LL ans[2000010];
void res(string & str)
{
	for(int i=0;i<str.size()/2;i++) swap(str[i],str[str.size()-i-1]);
}
int limit;
int main()
{
	cin>>str1>>str2;
	res(str1);
	res(str2);
//	cout<<str1<<endl;
	limit=1;while(limit<=str1.size()+str2.size()-1) limit<<=1;
	a.reserve(limit);
//	cout<<limit<<endl;
	for(int i=0;i<limit;i++) 
	a.push_back(complex(i<str1.size()?(str1[i]>='0'&&str1[i]<='9'?str1[i]-'0':0):0,
				 i<str2.size()?(str2[i]>='0'&&str2[i]<='9'?str2[i]-'0':0):0));
	//(i<str.size())xxx:0
	a=fft(a,1);
//	debug for(int i=0;i<limit;i++) cout<<a[i].x<<" "<<a[i].y<<endl;
	for(int i=0;i<limit;i++) a[i]=a[i]*a[i];
//	debug for(int i=0;i<limit;i++) cout<<a[i].x<<" "<<a[i].y<<endl;
	a=fft(a,-1);
//	debug for(int i=0;i<limit;i++) cout<<a[i].x<<" "<<a[i].y<<endl;
	for(int i=0;i<limit;i++) ans[i]=a[i].y/limit/2+0.5;
//	debug for(int i=0;i<limit;i++) cout<<ans[i]<<" ";cout<<endl;
	for(int i=0;i<limit-1;i++) ans[i+1]+=ans[i]/10,ans[i]%=10;
	bool flag=0;
	for(int i=limit-1;i>=0;i--)
	{
		if(ans[i]) flag=1;
		if(flag) cout<<ans[i];
	}
	return 0;
}



拜托了各位,谢谢了!

2020/11/29 20:23
加载中...