• [BZOJ2179]FFT快速傅立叶


    [BZOJ2179]FFT快速傅立叶

    题目大意:

    (a imes b(1le a,ble10^{60000}))

    思路:

    FFT模板。

    源代码:

    #include<cmath>
    #include<cstdio>
    #include<cctype>
    #include<complex>
    #include<algorithm>
    inline int getint() {
    	register char ch;
    	while(!isdigit(ch=getchar()));
    	register int x=ch^'0';
    	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    	return x;
    }
    inline int getdigit() {
    	register char ch;
    	while(!isdigit(ch=getchar()));
    	return ch^'0';
    }
    typedef std::complex<double> complex;
    const double pi=M_PI;
    const int N=131075;
    int lim,ans[N];
    complex a[N],b[N],c[N],omega[N],iomega[N];
    inline void init_omega(const int &n) {
    	for(register int i=0;i<n;i++) {
    		omega[i]=(complex){cos(2*pi*i/lim),sin(2*pi*i/lim)};
    		iomega[i]=conj(omega[i]);
    	}
    }
    inline void fft(complex f[],complex w[],const int &n) {
    	for(register int i=0,j=0;i<n;i++) {
    		if(i>j) std::swap(f[i],f[j]);
    		for(register int l=n>>1;(j^=l)<l;l>>=1);
    	}
    	for(register int i=2;i<=n;i<<=1) {
    		const int m=i>>1;
    		for(register int j=0;j<n;j+=i) {
    			for(register int k=0;k<m;k++) {
    				const complex z=f[j+m+k]*w[n/i*k];
    				f[j+m+k]=f[j+k]-z;
    				f[j+k]+=z;
    			}
    		}
    	}
    }
    int main() {
    	const int n=getint();
    	for(register int i=0;i<n;i++) a[i]=getdigit();
    	for(register int i=0;i<n;i++) b[i]=getdigit();
    	std::reverse(&a[0],&a[n]);
    	std::reverse(&b[0],&b[n]);
    	for(lim=1;lim<n;lim<<=1);lim<<=1;
    	init_omega(lim);
    	fft(a,omega,lim);
    	fft(b,omega,lim);
    	for(register int i=0;i<lim;i++) {
    		c[i]=a[i]*b[i];
    	}
    	fft(c,iomega,lim);
    	for(register int i=0;i<lim;i++) {
    		ans[i]=round(c[i].real()/lim);
    	}
    	int len=0;
    	for(register int i=0;i<lim;i++) {
    		if(ans[i]) len=i;
    		ans[i+1]+=ans[i]/10;
    		ans[i]%=10;
    	}
    	for(register int i=len;i>=0;i--) {
    		printf("%d",ans[i]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    mini2440移植uboot 2014.04(四)
    mini2440移植uboot 2014.04(三)
    【这些年】Linux C/C++软件开发用过的工具
    Valgrind的Memcheck快速入门
    《浪潮之巅》读后感
    三层浅析及示例分析
    C语言的代码内存布局详解
    超级立方体小记
    如何和项目经理沟通产品的交付?
    CentOS配置smaba与Windows共享文件
  • 原文地址:https://www.cnblogs.com/skylee03/p/9323258.html
Copyright © 2020-2023  润新知