第一次学FFT,先膜拜一下法法塔大神ORZ

关于FFT的话,有一篇博文特别赞http://z55250825.blog.163.com/blog/static/150230809201431274653644/

他后面还有关于高精度和jsoi2014 力的题解写的特别好

其次算导讲的真的不错

不过这篇博文讲得更算导差不多了ORZ

直接上代码吧

尼玛重载运算符老写错QAQ

好吧突然发现以前有一点错误,然后插了别人的代码来check,后来自己的就没了= = sorry

CODE:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#define pi acos(-1.0)
using namespace std;
#define maxn 400010
struct com{
 double r,i;
 com(double real=0.0,double imag=0.0){
  r=real,i=imag;
 }
 com operator + (const com x){
  return com(x.r+r,i+x.i);
 }
 com operator - (const com x){
  return com(r-x.r,i-x.i);
 }
 com operator * (const com x){
  return com(x.r*r-x.i*i,r*x.i+i*x.r);
 }
}x1[maxn*2],x2[maxn*2];
bool bo[maxn*2];
int bitrev(com *a,int l){
 memset(bo,0,sizeof(bo));//O(logn)的在后面
 for(int i=1;i<l-1;i++){
  int x=i,y=0;
  int m=(int)log2(l)+0.1;
  if(bo[x])continue;
  while(m--){
   y<<=1;
   y|=(x&1);
   x>>=1;
  }
  bo[i]=bo[y]=1;
  swap(a[i],a[y]);
 }
 return 0;
}
void fft(com *y,int l,double on) // FFT O(nlogn)
         // 其中on==1时为DFT,on==-1为IDFT
{
 register int h,i,j,k;
 com u,t;
 bitrev(y,l); // 调用反转置换
 for(h=2;h<=l;h<<=1) // 控制层数
 {
  // 初始化单位复根
  com wn(cos(on*2*pi/h),sin(on*2*pi/h));
  for(j=0;j<l;j+=h) // 控制起始下标
  {
   com w(1,0); // 初始化螺旋因子
   for(k=j;k<j+h/2;k++) // 配对
   {
    u=y[k];
    t=w*y[k+h/2];
    y[k]=u+t;
    y[k+h/2]=u-t;
    w=w*wn; // 更新螺旋因子
   } // 据说上面的操作叫蝴蝶操作…
  }
 }
 if(on==-1) for(i=0;i<l;i++) y[i].r/=l; // IDFT
}
char a[maxn],b[maxn];
int sum[maxn*2];
int main(){
 int l1,l2,l;
 scanf("%s%s",a,b);
 l1=strlen(a);l2=strlen(b);
 l=1;
 while (l<l1*2||l<l2*2) {
  l<<=1;
 }
 for (int j=0;j<l1;j++) {
  x1[j].r=a[l1-j-1]-'0';
  x1[j].i=0.0;
 }
 for (int i=l1;i<l;i++) x1[i]=com(0.0,0.0);
 for (int j=0;j<l2;j++) {
  x2[j].r=b[l2-j-1]-'0';
  x2[j].i=0.0;
 }
 for (int i=l2;i<l;i++) x2[i]=com(0.0,0.0);
 fft(x1,l,1);
 fft(x2,l,1);
 for (int i=0;i<l;i++) {
  x1[i]=x1[i]*x2[i];
 }
 fft(x1,l,-1);
 for (int i=0;i<l;i++) sum[i]=x1[i].r+0.5;
 for (int i=0;i<l;i++) {
  sum[i+1]+=sum[i]/10;
  sum[i]%=10; 
 }
 l=l1+l2-1;
 while(sum[l]<=0 && l>0) l--; // 检索最高位
 for(int i=l;i>=0;i--) putchar(sum[i]+'0'); // 倒序输出
 return 0;
}

wikioi 3132 高精度乘法(FFT)的更多相关文章

  1. 高精度乘法(FFT)

    学会了FFT之后感觉自己征服了世界! 当然是幻觉... 不过FFT还是很有用的,在优化大规模的动规问题的时候有极大效果. 一般比较凶残的计数动规题都需要FFT(n<=1e9). 下面是高精度乘法 ...

  2. FFT实现高精度乘法

    你应该知道$FFT$是用来处理多项式乘法的吧. 那么高精度乘法和多项式乘法有什么关系呢? 观察这样一个$20$位高精度整数$11111111111111111111$ 我们可以把它处理成这样的形式:$ ...

  3. P1919 FFT加速高精度乘法

    P1919 FFT加速高精度乘法 传送门:https://www.luogu.org/problemnew/show/P1919 题意: 给出两个n位10进制整数x和y,你需要计算x*y. 题解: 对 ...

  4. [vijos P1040] 高精度乘法

    如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了, ...

  5. 【PKU1001】Exponentiation(高精度乘法)

    Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 145642   Accepted: 35529 ...

  6. hdu 1042 N!(高精度乘法 + 缩进)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目大意:求n!, n 的上限是10000. 解题思路:高精度乘法 , 因为数据量比较大, 所以 ...

  7. hdu 1042 N!(高精度乘法)

    Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!   Input One N in ...

  8. Vijos 1040 高精度乘法

    描述 高精度乘法 输入:两行,每行表示一个非负整数(不超过10000位) 输出:两数的乘积. 样例1 样例输入1 99 101 样例输出1 9999 题解 这道题和之前的Vijos 1010 清帝之惑 ...

  9. 【POJ 1001】Exponentiation (高精度乘法+快速幂)

    BUPT2017 wintertraining(15) #6A 题意 求\(R^n\) ( 0.0 < R < 99.999 )(0 < n <= 25) 题解 将R用字符串读 ...

随机推荐

  1. Ubuntu14.04 64bit编译u-boot-2016.07提示 Your dtc is too old, please upgrade to dtc 1.4 or newer

    Author:AP0904225版权声明:本文为博主原创文章,转载请标明出处. Ubuntu14.04 64bit环境下编译u-boot-2016.07提示如下错误: CHK include/conf ...

  2. 315.Count of Smaller Numbers After Self My Submissions Question

    You are given an integer array nums and you have to return a new counts array. Thecounts array has t ...

  3. Js把IE COM数组列表转换成数组

    今天写组件的时候遇到一个问题,就是当我需要对获取到的对象列表进行删减的时候,发现没有合适的方法,比如: //获取图片列表 var imgs = document.getElementsByTagNam ...

  4. 利用cocoapods创建基于git的私有库

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  5. UVa 129 困难的串

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. jQuery仿淘宝图片无缝滚动轮播

    自己前天,也就是1月8日的时候早上自己写了一个图片滚动轮播(基于jQuery). 其实几个月以前就有朋友问过我怎么做出和淘宝上面一样的滚动轮播,一直到现在也没有真正的写好,这次写得差不多了. 但是还有 ...

  7. Newman的 power law 参数估计的程序matlab(转载)

    转自:http://blog.sciencenet.cn/blog-4716-46173.html 对于幂率分布的估计问题是个很复杂的问题(..., the empirical detection a ...

  8. Web浏览器兼容性测试工具如何选择

    对于前端开发工程师来说,网页兼容性测试工程师而言,确保代码在各种主流浏览器的各个版本中都能正常工作是件很费时的事情,幸运的是,有很多优秀的工具可以帮助测试浏览器的兼容性,领测软件测试网向您推荐12款很 ...

  9. Node.js理解

    JavaScript单线程的误解 在我接触JavaScript(无论浏览器还是NodeJS)的时间里,总是遇到有朋友有多线程的需求.而在NodeJS方面,有朋友甚至直接说到,NodeJS是单线程的,无 ...

  10. CAGradientLayer颜色渐变器

    使用CAGradientLayer可以实现颜色的渐变, 我们先看下头文件 @interface CAGradientLayer : CALayer @property(nullable, copy) ...