zoukankan      html  css  js  c++  java
  • 【bzoj2179】FFT快速傅立叶 FFT

    题目描述

    给出两个n位10进制整数x和y,你需要计算x*y。

    输入

    第一行一个正整数n。 第二行描述一个位数为n的正整数x。 第三行描述一个位数为n的正整数y。

    输出

    输出一行,即x*y的结果。

    样例输入

    1
    3
    4

    样例输出

    12


    题解

    裸的FFT

    然而压位会导致精度误差,很难改正,所以最好不要压位。

    (我就是因为压位WA了无数次QAQ)

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #define N 1 << 20
    #define pi acos(-1)
    using namespace std;
    struct data
    {
    	double x , y;
    	data() {x = y = 0;}
    	data(double x0 , double y0) { x = x0 , y = y0;}
    	data operator +(const data a)const {return data(x + a.x , y + a.y);}
    	data operator -(const data a)const {return data(x - a.x , y - a.y);}
    	data operator *(const data a)const {return data(x * a.x - y * a.y , x * a.y + y * a.x);}
    }a[N] , b[N] , c[N];
    char sa[N] , sb[N];
    int ans[N];
    void fft(data *a , int n , int flag)
    {
    	int i , j , k = 0;
    	for(i = 0 ; i < n ; i ++ )
    	{
    		if(i > k) swap(a[i] , a[k]);
    		for(j = (n >> 1) ; (k ^= j) < j ; j >>= 1);
    	}
    	for(k = 2 ; k <= n ; k <<= 1)
    	{
    		data wn(cos(2 * pi * flag / k) , sin(2 * pi * flag / k));
    		for(i = 0 ; i <= n ; i += k)
    		{
    			data t , w(1 , 0);
    			for(j = 0 ; j < (k >> 1) ; j ++ , w = w * wn)
    			{
    				t = w * a[i + j + (k >> 1)];
    				a[i + j + (k >> 1)] = a[i + j] - t;
    				a[i + j] = a[i + j] + t;
    			}
    		}
    	}
    }
    int main()
    {
    	int n , i , len;
    	scanf("%d%s%s" , &n , sa + 1 , sb + 1);
    	for(i = n ; i > 0 ; i -- )
    		a[n - i].x = a[n - i].x * 10 + sa[i] - '0' , b[n - i].x = b[n - i].x * 10 + sb[i] - '0';
    	for(len = 1 ; len <= (n << 1) ; len <<= 1);
    	fft(a , len , 1) , fft(b , len , 1);
    	for(i = 0 ; i < len ; i ++ ) c[i] = a[i] * b[i];
    	fft(c , len , -1);
    	for(i = 0 ; i < len ; i ++ ) ans[i] = (int)((c[i].x + 0.5) / len);
    	for(i = 0 ; i < len ; i ++ ) ans[i + 1] += ans[i] / 10 , ans[i] %= 10;
    	for(i = len - 1 ; i && !ans[i] ; i -- );
    	for( ; ~i ; i -- ) printf("%d" , ans[i]);
    	printf("
    ");
    	return 0;
    }
    

     

  • 相关阅读:
    asp.net jquery+ajax异步刷新1
    Android自定义组合控件:UIScrollLayout(支持界面滑动及左右菜单滑动)
    南京三星面试准备1--字符串
    如何有效的设立目标
    MySQL 主主复制
    POJ 2914 Minimum Cut 最小割算法题解
    openstack中虚拟机怎么与物理机通信
    SpringMVC+Spring+Mybatis+Mysql项目搭建
    Android面试准备 第二天 第五例 数据存储
    COCOS2D-X 3.0在MAC下创建新IOS项目:
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6878415.html
Copyright © 2011-2022 走看看