zoukankan      html  css  js  c++  java
  • fft模板 HDU 1402

      1 // fft模板 HDU 1402
      2 
      3 #include <iostream>
      4 #include <cstdio>
      5 #include <cstdlib>
      6 #include <algorithm>
      7 #include <vector>
      8 #include <math.h>
      9 #include <memory.h>
     10 #include <bits/stdc++.h>
     11 using namespace std;
     12 #define LL long long
     13 typedef pair<int,int> pii;
     14 const LL inf = 0x3f3f3f3f;
     15 const LL MOD =100000000LL;
     16 const int N = 150010;
     17 const double eps = 1e-8;
     18 void fre() {freopen("in.txt","r",stdin);}
     19 void freout() {freopen("out.txt","w",stdout);}
     20 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
     21 
     22 
     23 const double PI = acos(-1.0);
     24 //复数结构体
     25 struct Complex{
     26     double r,i;
     27     Complex(double _r = 0.0,double _i = 0.0){
     28         r = _r; i = _i;
     29     }
     30     Complex operator +(const Complex &b){
     31         return Complex(r+b.r,i+b.i);
     32     }
     33     Complex operator -(const Complex &b){
     34         return Complex(r-b.r,i-b.i);
     35     }
     36     Complex operator *(const Complex &b){
     37         return Complex(r*b.r-i*b.i,r*b.i+i*b.r);
     38     }
     39 };
     40 /*
     41  * 进行FFT和IFFT前的反转变换。
     42  * 位置i和 (i二进制反转后位置)互换
     43  * len必须去2的幂
     44  */
     45 void change(Complex y[],int len){
     46     int i,j,k;
     47     for(i = 1, j = len/2;i < len-1; i++){
     48         if(i < j)swap(y[i],y[j]);
     49         //交换互为小标反转的元素,i<j保证交换一次
     50         //i做正常的+1,j左反转类型的+1,始终保持i和j是反转的
     51         k = len/2;
     52         while( j >= k){
     53             j -= k;
     54             k /= 2;
     55         }
     56         if(j < k) j += k;
     57     }
     58 }
     59 /*
     60  * 做FFT
     61  * len必须为2^k形式,
     62  * on==1时是DFT,on==-1时是IDFT
     63  */
     64 void fft(Complex y[],int len,int on){
     65     change(y,len);
     66     for(int h = 2; h <= len; h <<= 1){
     67         Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
     68         for(int j = 0;j < len;j+=h){
     69             Complex w(1,0);
     70             for(int k = j;k < j+h/2;k++){
     71                 Complex u = y[k];
     72                 Complex t = w*y[k+h/2];
     73                 y[k] = u+t;
     74                 y[k+h/2] = u-t;
     75                 w = w*wn;
     76             }
     77         }
     78     }
     79     if(on == -1)
     80         for(int i = 0;i < len;i++)
     81             y[i].r /= len;
     82 }
     83 
     84 Complex a[N],b[N];
     85 char s1[N/2],s2[N/2];
     86 int ans[N];
     87 int main(){
     88     while(~scanf("%s%s",s1,s2)){
     89          int len1=strlen(s1);
     90          int len2=strlen(s2);
     91          int l1=0,l2=0;
     92          while((1<<l1)<len1) l1++;
     93          while((1<<l2)<len2) l2++;
     94          int len=(1<<(max(l1,l2)+1));
     95          for(int i=0;i<len;i++){
     96             if(i<len1) a[i]=Complex(s1[len1-i-1]-'0',0);
     97             else a[i]=Complex(0,0);
     98             if(i<len2) b[i]=Complex(s2[len2-i-1]-'0',0);
     99             else b[i]=Complex(0,0);  
    100          }
    101          fft(a,len,1);
    102          fft(b,len,1);
    103          for(int i=0;i<len;i++)
    104             a[i]=a[i]*b[i];
    105          fft(a,len,-1);
    106          for(int i=0;i<len;i++)
    107             ans[i]=(int)(a[i].r+0.5);
    108          for(int i=0;i<len-1;i++){
    109             ans[i+1]+=ans[i]/10;
    110             ans[i]%=10;
    111          }
    112          bool flag=false;
    113          for(int i=len-1;i>=0;i--){
    114             if(ans[i]) printf("%d",ans[i]),flag=true;
    115             else if(flag||i==0)printf("0");
    116         }
    117         printf("
    ");
    118     }
    119     return 0;
    120 }
  • 相关阅读:
    idea设置全局ignore
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistributable. Please ins
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistr
    kafka 删除 topic
    java编译中出现了Exception in thread “main" java.lang.UnsupportedClassVersionError
    Centos中使用yum安装java时,没有jps的问题的解决
    Spring 整合Junit
    Spring纯注解配置
    Spring 基于注解的 IOC 配置
    打印java系统的信息
  • 原文地址:https://www.cnblogs.com/ITUPC/p/5918189.html
Copyright © 2011-2022 走看看