bzoj 2179: FFT快速傅立叶 -- FFT

2179: FFT快速傅立叶

Time Limit: 10 Sec  Memory Limit: 259 MB

Description

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

Input

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

Output

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

Sample Input

1
3
4

Sample Output

12

数据范围:
n<=60000

HINT

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<complex>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define cp complex<double>
#define ll long long
#define PI acos(-1)
#define N 200010
int n,m,c[N],L=-1,r[N];
cp a[N],b[N];
char s1[N],s2[N];
void FFT(cp *x,int f)
{
    for(int i=0;i<n;i++) if(i<r[i]) swap(x[i],x[r[i]]);
    for(int i=1;i<n;i<<=1)
    {
        cp wn(cos(PI/i),f*sin(PI/i));
        for(int j=0;j<n;j+=(i<<1))
        {
            cp w(1,0),X,Y;
            for(int k=0;k<i;k++,w*=wn)
            {
                X=x[j+k];Y=w*x[j+k+i];
                x[j+k]=X+Y;x[j+k+i]=X-Y;
            }
        }
    }
}
int main()
{
    scanf("%d%s%s",&n,s1,s2);n--;
    for(int i=0;i<=n;i++) a[i]=s1[n-i]-‘0‘;
    for(int i=0;i<=n;i++) b[i]=s2[n-i]-‘0‘;
    m=n<<1;for(n=1;n<=m;n<<=1) L++;
    for(int i=0;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<L);
    FFT(a,1);FFT(b,1);
    for(int i=0;i<=n;i++) a[i]*=b[i];
    FFT(a,-1);
    for(int i=0;i<=m;i++) c[i]=(int)(a[i].real()/n+0.1);
    for(int i=0;i<=m;i++)
    {
        if(c[i]>9)
        {
            c[i+1]+=c[i]/10;
            c[i]%=10;if(i==m)m++;
        }
    }
    for(int i=m;i>=0;i--) printf("%d",c[i]);
    return 0;
}
时间: 2024-10-20 04:26:15

bzoj 2179: FFT快速傅立叶 -- FFT的相关文章

【bzoj2179】FFT快速傅立叶 FFT模板

2016-06-01  09:34:54 很久很久很久以前写的了... 今天又比较了一下效率,貌似手写复数要快很多. 贴一下模板: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue> 8 #includ

BZOJ 2179 FFT快速傅立叶 ——FFT

[题目分析] 快速傅里叶变换用于高精度乘法. 其实本质就是循环卷积的计算,也就是多项式的乘法. 两次蝴蝶变换. 二进制取反化递归为迭代. 单位根的巧妙取值,是的复杂度成为了nlogn 范德蒙矩阵计算逆矩阵又减轻了拉格朗日插值法的复杂度. 十分神奇. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #includ

【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

BZOJ 2179: FFT快速傅立叶

2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3138  Solved: 1620[Submit][Status][Discuss] Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果. Sample Input 1 3 4 Sample Outpu

【BZOJ 2179】【FFT模板】 FFT快速傅立叶

2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 1595 Solved: 792 [Submit][Status][Discuss] Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果. Sample Input 1 3 4 Sample Output

【BZOJ2179】FFT快速傅立叶

[BZOJ2179]FFT快速傅立叶 Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果. Sample Input 1 3 4 Sample Output 12 数据范围: n<=60000 题解:板子题,敲板子~ #include <cstdio> #include <cstring> #include

2179: FFT快速傅立叶|快速傅里叶变换

背板子大法吼 #include<algorithm> #include<iostream> #include<complex> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<ctime> #include<cmath> #include<m

FFT快速傅立叶变换的工作原理

实数DFT,复数DFT,FFT FFT是计算DFT的快速算法,但是它是基于复数的,所以计算实数DFT的时候需要将其转换为复数的格式,下图展示了实数DFT和虚数DFT的情况,实数DFT将时域中N点信号转换成2个(N/2+1)点的频域信号,其中1个(N/2+1)点的信号称之为实部,另一个(N/2+1)点的信号称之为虚部,实部和虚部分别是正弦和余弦信号的幅度. 相比较而言,复数DFT将2个N点的时域信号转换为2个N点的频域信号.时域和频域中,1个N点信号是实部,另1个N点信号是虚部. 如果要计算N点实

Bzoj2179 FFT快速傅立叶

Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3079  Solved: 1581 Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果. Sample Input 1 3 4 Sample Output 12 数据范围: n<=60000 HINT Source FFT FFT真