描述


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

超大整数乘法

分析


FFT模板题.

把数字看成是多项式,x是10.然后用FFT做多项式乘法,最后进位就好了.

注意:

1.进位前要把每一位加0.5(或者更小),然后向下取整,应该是浮点数的计算误差吧...

 #include <bits/stdc++.h>
using namespace std; const int maxn=;
const double pi=acos(-1.0);
int len;
int rev[maxn],ans[maxn];
char str[maxn];
struct cp{//复数(complex)
double r,i;
cp(double r_=0.0,double i_=0.0):r(r_),i(i_){}
cp operator + (const cp &x) const { return cp(r+x.r,i+x.i); }
cp operator - (const cp &x) const { return cp(r-x.r,i-x.i); }
cp operator * (const cp &x) const { return cp(r*x.r-i*x.i,r*x.i+i*x.r); }
}a[maxn],b[maxn],A[maxn];
void brc(int &len){//二进制逆序置换(bit-reverse-copy)
memset(rev,-,sizeof rev);
int k=,l=;
while(k<len) k<<=,l++;
len=k;
rev[]=; rev[len-]=len-;
for(int i=;i<len-;i++){
if(rev[i]!=-) continue;
int x=i,y=,m=l;
while(m--) y<<=, y|=(x&), x>>=;
rev[i]=y; rev[y]=i;
}
}
void dft(cp *a,int n,int flag){//离散傅里叶变换(discrete-Fourier-transform)
for(int i=;i<n;i++) A[rev[i]]=a[i];
for(int i=;i<n;i++) a[i]=A[i];
for(int m=;m<=n;m<<=){
cp wn(cos(2.0*pi/m*flag),sin(2.0*pi/m*flag));
for(int i=;i<n;i+=m){
cp w(1.0,0.0); int k=m>>;
for(int j=;j<k;j++){
cp t=w*a[i+j+k], u=a[i+j];
a[i+j]=u+t;
a[i+j+k]=u-t;
w=w*wn;
}
}
}
if(flag==-)for(int i=;i<n;i++) a[i].r/=n;
}
void readin(cp *a){
scanf("%s",str);
int l=strlen(str);
for(int i=;i<l;i++) a[i].r=str[l--i]-'';
}
int main(){
scanf("%d",&len);
len=len*-;
readin(a); readin(b);
brc(len);
dft(a,len,); dft(b,len,);
for(int i=;i<len;i++) a[i]=a[i]*b[i];
dft(a,len,-);
for(int i=;i<len;i++) ans[i]=a[i].r+0.5;
for(int i=;i<len;i++) ans[i+]+=ans[i]/, ans[i]%=;
len++;
while(!ans[len]&&len) len--;
for(int i=len;i>=;i--) printf("%d",ans[i]);
return ;
}

2179: FFT快速傅立叶

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 2567  Solved: 1308
[Submit][Status][Discuss]

Description

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

Input

第一行一个正整数n。
第二行描述一个位数为n的正整数x。
第三行描述一个位数为n的正整数y。

Output

输出一行,即x*y的结果。

Sample Input

1
3
4

Sample Output

12

数据范围:
n<=60000

HINT

Source

BZOJ_2179_FFT快速傅立叶_(FFT)的更多相关文章

  1. 快速傅立叶变换(FFT)算法

    已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...

  2. 【BZOJ】2179: FFT快速傅立叶(fft)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2179 fft裸题.... 为嘛我的那么慢....1000多ms.. #include <cst ...

  3. 快速傅立叶变换FFT模板

    递归版 UOJ34多项式乘法 //容易暴栈,但是很好理解 #include <cmath> #include <iostream> #include <cstdio> ...

  4. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换

    写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...

  5. BZOJ_2194_快速傅立叶之二_(FFT+卷积)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2194 给出序列\(a[0],a[1],...,a[n-1]\)和\(b[0],b[1],... ...

  6. $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换

    \(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...

  7. 快速傅立叶变换(FFT)

    多项式 系数表示法 设\(f(x)\)为一个\(n-1\)次多项式,则 \(f(x)=\sum\limits_{i=0}^{n-1}a_i*x_i\) 其中\(a_i\)为\(f(x)\)的系数,用这 ...

  8. BZOJ 2179: FFT快速傅立叶

    2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2923  Solved: 1498[Submit][Status][Di ...

  9. 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶

    第一次写法法塔,,,感到威力无穷啊 看了一上午算导就当我看懂了?PS:要是机房里能有个清净的看书环境就好了 FFT主要是用了巧妙的复数单位根,复数单位根在复平面上的对称性使得快速傅立叶变换的时间复杂度 ...

随机推荐

  1. MySQL的记录长度

    MySQL的记录长度 MySQL默认规定一条记录最大的长度是65535字节,所有的字段加在一起所占的字节数不能超过65535.但是MySQL中字段的长度有的时使用字节来规定int,有些字段类型是使用字 ...

  2. [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

    本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依 ...

  3. 实习笔记-1:sql 2008r2 如何创建定时作业

    在公司实习了近一个月,学了很多东西.这一篇是一些比较基础的东西,本人是小菜鸟,不喜欢大神来喷.大神欢迎出门点右上角.谢谢~ 说大实话,对于数据库,我在还没出来实习的时候就是只懂写一些sql语句以及知道 ...

  4. aspx页面状态管理Cookie和ViewState

    Cookie 设置cookie protected void Button2_Click(object sender, EventArgs e) { HttpCookie cookie = new H ...

  5. CSS中Padding的用法

    Padding的英文意思是填充,在CSS中则是设置内边距属性. padding不允许使用负值 1. 四个参数时: padding: 10px,20px,30px,40px; 上边距:10px 右边距: ...

  6. 转:testlink 环境搭建(傻瓜版)

    testlink 环境搭建(傻瓜版) 2011-11-24 22:23 by 虫师, 12322 阅读, 4 评论, 收藏, 编辑 今天抽了点时间把testlink 环境搭建了一下,一直觉得这东西不怎 ...

  7. python制作安装包(setup.py)

    1.制作setup.py from distutils.core import setup setup(name='Myblog', version='1.0', description='My Bl ...

  8. Linux和Windows下查看环境变量方法对比

    摘自:Linux和Windows下查看环境变量方法对比 一.查看所有环境变量的名称和值 Linux下:export Windows下:set 二.根据名称查该环境变量的值 Linux下:echo $环 ...

  9. vs2013 上传碰到的问题:“输入的不是有效的 Base-64 字符串 ”

    action 代码: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create( ImageStoreModels images ...

  10. 老鸟的Python入门教程

    转自老鸟的Python入门教程 重要说明 这不是给编程新手准备的教程,如果您入行编程不久,或者还没有使用过1到2门编程语言,请移步!这是有一定编程经验的人准备的.最好是熟知Java或C,懂得命令行,S ...