bzoj 2179 FFT快速傅里叶

真 · 背板子。好像是用到了分治思想。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<complex>
#include<iostream>
using namespace std;
double pi=acos(-1);
typedef complex<double> E;
E a[140005],b[140005];
void fft(E *x,int n,int type)
{
    if(n==1) return ;
    E l[n>>1],r[n>>1];
    for(int i=0;i<n;i+=2)
        l[i>>1]=x[i],r[i>>1]=x[i+1];
    fft(l,n>>1,type);fft(r,n>>1,type);
    E wn(cos(2*pi/n),sin(type*2*pi/n)),w(1,0),t;
    for(int i=0;i<n>>1;i++,w*=wn)
        t=w*r[i],x[i]=l[i]+t,x[i+(n>>1)]=l[i]-t;
}
int w[140005];
char A[60005],B[60005];
double eps=0.01;
int main()
{
    int n;
    scanf("%d",&n);
    scanf("%s%s",A,B);
    for(int i=0;i<n;i++) a[i]=A[n-i-1]-'0';
    for(int i=0;i<n;i++) b[i]=B[n-i-1]-'0';
    int m=n*2-2;for(n=1;n<=m;n<<=1);
    fft(a,n,1);fft(b,n,1);
    for(int i=0;i<n;i++) a[i]*=b[i];
    fft(a,n,-1);
    for(int i=0;i<n;i++) 
        w[i]=a[i].real()/n+0.5;
    for(int i=0;i<=m;i++)
        if(w[i]>=10)
        {
            w[i+1]+=w[i]/10;w[i]%=10;
            if(i==m) m++;
        }
    for(int i=m;i>=0;i--)
        printf("%d",w[i]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值