zoukankan      html  css  js  c++  java
  • hdu 1402 A * B Problem Plus FFT

    /*
    hdu 1402 A * B Problem Plus FFT
    
    这是我的第二道FFT的题
    
    第一题是完全照着别人的代码敲出来的,也不明白是什么意思
    
    这个代码是在前一题的基础上改的
    
    做完这个题,我才有点儿感觉,原来FFT在这里就是加速大整数乘法而已
    
    像前一题,也是一个大整数乘法,然后去掉一些非法的情况
    
    */
    #pragma warning(disable : 4786)
    #pragma comment(linker, "/STACK:102400000,102400000")
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <functional>
    #include <map>
    #include <set>
    #include <vector>
    #include <stack>
    #include <queue>//priority_queue
    #include <bitset>
    #include <complex>
    #include <utility>
    /*
    **make_pair()
    **/
    using namespace std;
    const double eps=1e-8;
    const double PI=acos(-1.0);
    const int inf=0x7fffffff;
    template<typename T> inline T MIN(T a,T b){return a<b?a:b;}
    template<typename T> inline T MAX(T a,T b){return a>b?a:b;}
    template<typename T> inline T SQR(T a){return a*a;}
    inline int dbcmp(double a){return a>eps?(1):(a<(-eps)?(-1):0);}
    
    typedef __int64 LL;
    int n;
    const int size=400040;
    int data[size/4];
    int sum[size];
    complex<double> x1[size],num1[size],num2[size];
    
    
    
    void change(complex<double> y[],int len)
    {
        int i,j,k;
        for(i = 1, j = len/2;i < len-1;i++)
        {
            if(i < j)swap(y[i],y[j]);
            k = len/2;
            while( j >= k)
            {
                j -= k;
                k /= 2;
            }
            if(j < k)j += k;
        }
    }
    void fft(complex<double> y[],int len,int on)
    {
        change(y,len);
        for(int h = 2;h <= len;h <<= 1)
        {
            complex<double> wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
            for(int j = 0;j < len;j += h)
            {
                complex<double> w(1,0);
                for(int k = j;k < j+h/2;k++)
                {
                    complex<double> u = y[k];
                    complex<double> t = w*y[k+h/2];
                    y[k] = u+t;
                    y[k+h/2] = u-t;
                    w = w*wn;
                }
            }
        }
        if(on == -1)
            for(int i = 0;i < len;i++)
                y[i].real(y[i].real()/len);
    }
    char s1[size];
    char s2[size];
    int main() {
    	// your code goes here
    	int t,i,j;
    	int len,len1,len2;
    	//cin>>t;
    	while(gets(s1))
    	{
    		gets(s2);
    		memset(num1,0,sizeof(num1));
    		memset(num2,0,sizeof(num2));
    		len1=strlen(s1);
    		len2=strlen(s2);
    		//printf("%d %d",len1,len2);
    		len=1;
    		while(len<2*len1||len<len2*2) len<<=1;
    		for(i=len1-1,j=0;i>=0;--i,++j)
    		{
    			num1[j]=complex<double>(s1[i]-'0',0);
    		}
    		while(j<=len)
    		{
    			num1[j]=complex<double>(0,0);
    			++j;
    		}
    		for(i=len2-1,j=0;i>=0;--i,++j)
    		{
    			num2[j]=complex<double>(s2[i]-'0',0);
    		}
    		while(j<=len)
    		{
    			num2[j]=complex<double>(0,0);
    			++j;
    		}
    		fft(num1,len,1);
    		fft(num2,len,1);
    		for(i=0;i<len;++i)
    		{
    			num1[i]=num1[i]*num2[i];
    		}
    		fft(num1,len,-1);
    
    		for(i=0;i<len;++i)
    		{
    			sum[i]=(int)(num1[i].real()+0.5);
    		}
    		for(i=0;i<len;++i)
    		{
    			sum[i+1]+=sum[i]/10;
    			sum[i]=sum[i]%10;
    		}
    		len=len1+len2-1;
    		while(sum[len]<=0&&len>0) --len;
    		for(;len>=0;--len)
    		{
    			printf("%c",sum[len]+'0');
    		}
    		printf("
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    MySql 5.6以下版本自定义函数返回VARCHAR的中文问题
    解决Tomcat的java.lang.IllegalStateException: Cannot create a session after the response has been committed问题
    Lucene自定义规则范围查询
    JS吊炸天的代码
    又是正则
    JS显示指定字符数,避免一个中文两个字符的情况
    PostgreSql查看当前表的主外键关系
    java基础(个人学习笔记) A
    Elasticsearch5.5.1插件开发指南
    ElasticSearch5.5.1插件分类
  • 原文地址:https://www.cnblogs.com/riskyer/p/3347979.html
Copyright © 2011-2022 走看看