zoukankan      html  css  js  c++  java
  • 快速傅里叶变换

    bzoj2179

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<string>
     6 #include<algorithm>
     7 #include<complex>
     8 #define N 250005
     9 using namespace std;
    10 typedef complex<double> cd;
    11 int a[N],b[N],c[N],lc,n;
    12 char s[N];
    13 double PI=acos(-1);
    14 int bitrev(int t,int n){
    15     int res=0;
    16     for (int i=0;i<n;i++) res|=(t>>(n-i-1)&1)<<i;
    17     return res; 
    18 }
    19 void fft(cd *a,int n,int rev){
    20     static cd y[N];
    21     int len=1<<n;
    22     for (int i=0;i<len;i++) y[i]=a[bitrev(i,n)];
    23     for (int d=1;d<len;d<<=1){
    24         cd wn(exp(cd(0,PI*rev/d)));
    25         for (int k=0;k<len;k+=d*2){
    26             cd w(1,0);
    27             for (int i=k;i<d+k;i++,w*=wn){
    28                 cd u=y[i],v=w*y[i+d];
    29                 y[i]=u+v;
    30                 y[i+d]=u-v;
    31             }
    32         }
    33     }
    34     if (rev==-1)
    35     for (int i=0;i<len;i++) y[i]/=len;
    36     for (int i=0;i<len;i++) a[i]=y[i];
    37 }
    38 void mul(int *a,int la,int *b,int lb,int *c,int &lc){
    39     static cd t1[N],t2[N];
    40     int len=1,n=0;
    41     for (;len<la*2||len<lb*2;len*=2,n++);
    42     for (int i=0;i<la;i++) t1[i]=cd(a[i],0);
    43     for (int i=0;i<lb;i++) t2[i]=cd(b[i],0);
    44     for (int i=la;i<len;i++) t1[i]=cd(0,0);
    45     for (int i=lb;i<len;i++) t2[i]=cd(0,0);
    46     fft(t1,n,1);
    47     fft(t2,n,1);
    48     for (int i=0;i<len;i++) t1[i]*=t2[i];
    49     fft(t1,n,-1);
    50     lc=len;
    51     for (int i=0;i<len;i++) c[i]=(int)(t1[i].real()+0.5);
    52 }
    53 int main(){
    54     scanf("%d",&n);
    55     scanf("%s",s);
    56     for (int i=0;i<n;i++) a[i]=s[n-i-1]-'0';
    57     scanf("%s",s);
    58     for (int i=0;i<n;i++) b[i]=s[n-i-1]-'0';
    59     mul(a,n,b,n,c,lc);
    60     for (int i=0;i<lc;i++) c[i+1]+=c[i]/10,c[i]%=10;
    61     for (--lc;lc&&!c[lc];lc--);
    62     for (int i=lc;i>=0;i--) printf("%d",c[i]);
    63 }

    G_word:只要背模板就行了233

  • 相关阅读:
    做好产品经理,需要具备哪些技能?
    【FastAPI 学习 四】 日志配置
    【FastAPI 学习三】 FastAPI SqlAlchemy MySql表迁移
    【FastAPI 学习 二】SqlAlchemy Model模型类
    【FastAPI 学习一】配置文件
    Python 时间操作 格式化“2020-10-16T17:36:00+08:00“时间
    Python sqlalchemy 原生SQL LIKE 查询
    Git 使用笔记
    数据清洗(一)
    PDF文件转换为TXT文件
  • 原文地址:https://www.cnblogs.com/qzqzgfy/p/5266490.html
Copyright © 2011-2022 走看看