zoukankan      html  css  js  c++  java
  • 高精乘(fft板子

    哇。。fft的原理真的是不太好懂,看了好久许多细节还是不太清楚,但感觉本质就是用了单位根的性质。

    https://www.luogu.org/problem/P1919

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<complex>
    using namespace std;
    int n;
    typedef complex<double> cd;
    #define maxl 2097153
    #define PI 3.14159265358979
    char s1[maxl],s2[maxl];
    cd a[maxl];
    cd b[maxl];
    int rev[maxl];
    void get_rev(int bit)
    {
    	for(int i=0;i<(1<<bit);i++)
    		rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
    }
    void fft(cd *a,int n,int dft)
    {
    	for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
    	for(int step=1;step<n;step<<=1)
    	{
    		cd wn=exp(cd(0,dft*PI/step));
    		for(int j=0;j<n;j+=step<<1)
    		{
    			cd wnk(1,0);
    			for(int k=j;k<j+step;k++)
    			{
    				cd x=a[k];
    				cd y=wnk*a[k+step];
    				a[k]=x+y;
    				a[k+step]=x-y;
    				wnk*=wn;
    			}
    		}
    	}
    	if(dft==-1) for(int i=0;i<n;i++) a[i]/=n;
    }
    int output[maxl];
    int main()
    {
     	//freopen("fft.in","r",stdin);
     	scanf("%s%s",s1,s2);
     	int l1=strlen(s1);
     	int l2=strlen(s2);
     	int s=2,bit=1;
     	for(bit=1;(1<<bit)<l1+l2-1;bit++)s<<=1;//maybe wiping the"-1" is better
     	for(int i=0;i<l1;i++) a[i]=(double)(s1[l1-i-1]-'0');
     	for(int i=0;i<l2;i++) b[i]=(double)(s2[l2-i-1]-'0');
     	//for(int i=0;i<8;i++) printf("%d %d
    ",i,rev[i]);
     	get_rev(bit);
    	fft(a,s,1);
    	fft(b,s,1);
    	for(int i=0;i<s;i++) a[i]*=b[i];
    	fft(a,s,-1);
    	for(int i=0;i<s;i++) 
    	{
    		output[i]+=(int)(a[i].real()+0.5);//取实数四舍五入,此时虚数部分应当为0或由于浮点误差接近0
    		output[i+1]+=output[i]/10;
    		output[i]%=10;
    	}
    	int i;
    	for(i=l1+l2;!output[i]&&i>=0;i--);
    	if(i==-1) printf("0");
    	for(;i>=0;i--) printf("%d",output[i]);
    	putchar('
    ');
    }
    
  • 相关阅读:
    使用一个Python脚本来运行一个简单的Django项目
    创建第一个Django项目
    Windows下安装Python3和Django
    node.js使用node-xlsx读写数据
    U盘分区后合并
    linux命令学习-3-sysctl
    linux命令学习-2-dmesg
    linux命令学习-1-less
    在服务器上排除问题的头五分钟
    c++读取REG_MULTI_SZ类型注册表
  • 原文地址:https://www.cnblogs.com/wzgg/p/11515672.html
Copyright © 2011-2022 走看看