zoukankan      html  css  js  c++  java
  • BZOJ 2179FFT快速傅立叶

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2179

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

    题解:FFT,不会的可以膜拜陈老师(非clj)QQ:297086016

    代码:

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cmath>
     5 #define inf 1<<30
     6 #define maxm 270005
     7 #define pi acos(-1)
     8 using namespace std;
     9 struct F{
    10     double rea,ima;    
    11     F operator +(const F &x){return (F){rea+x.rea,ima+x.ima};}
    12     F operator -(const F &x){return (F){rea-x.rea,ima-x.ima};}
    13     F operator *(const F &x){return (F){rea*x.rea-ima*x.ima,rea*x.ima+ima*x.rea};}
    14 }a[maxm],b[maxm],c[maxm],w,wn,t1,t2;
    15 int n,m,l,ans[maxm],rev[maxm];
    16 void read(F *a)
    17 {
    18     char ch;
    19     while (ch=getchar(),ch<'0'||ch>'9');
    20     for (int i=m-1; ch>='0'&&ch<='9';ch=getchar(),i--) a[i].rea=ch-'0';
    21 }
    22 int re(int v)
    23 {
    24     int t=0;
    25     for (int i=0; i<l; i++) t<<=1,t|=v&1,v>>=1;
    26     return t;
    27 }
    28 void fft(F *a,int type)
    29 {
    30     for (int i=0; i<n; i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
    31     for (int s=2; s<=n; s<<=1)
    32     {
    33         wn=(F){cos(type*2*pi/s),sin(type*2*pi/s)};
    34         for (int i=0; i<n; i+=s)
    35         {
    36             w=(F){1,0};
    37             for (int j=i; j<(i+(s>>1)); j++,w=w*wn)
    38             {
    39                 t1=a[j],t2=w*a[j+(s>>1)];
    40                 a[j]=t1+t2,a[j+(s>>1)]=t1-t2;
    41             }
    42         }
    43     }
    44 }
    45 int main()
    46 {
    47     scanf("%d
    ",&m);
    48     for (n=1; n<(m<<1); n<<=1) l++;
    49     for (int i=0; i<n; i++) rev[i]=re(i);
    50     read(a); read(b);
    51     fft(a,1); fft(b,1);
    52     for (int i=0; i<n; i++) c[i]=a[i]*b[i];
    53     fft(c,-1);
    54     for(int i=0;i<n;i++) ans[i]=int(c[i].rea/n+0.5);
    55     for(int i=0;i<n;i++) ans[i+1]+=ans[i]/10,ans[i]=ans[i]%10;
    56     int pps=n-1;while(ans[pps]==0&&pps)pps--;
    57     for(;pps>=0;pps--)printf("%d",ans[pps]);printf("
    ");
    58     return 0;
    59 }
    View Code
  • 相关阅读:
    [oracle] linux Oracle 安装配置
    [dns] linux dns 安装配置
    [apache] linux Apache 编译安装
    [yum] linux yum 配置本地和ftp源
    [ftp] linux ftp 安装配置
    [ssh 无密码访问]linux ssh公匙密匙无密码访问
    [php ] linux php 搭建
    [mysql ] linux mysal 修改字符集
    [ mysql ] linux mysql 忘记root密码重置
    国安是冠军
  • 原文地址:https://www.cnblogs.com/HQHQ/p/5595146.html
Copyright © 2011-2022 走看看