【题目分析】

快速傅里叶变换用于高精度乘法。

其实本质就是循环卷积的计算,也就是多项式的乘法。

两次蝴蝶变换。

二进制取反化递归为迭代。

单位根的巧妙取值,是的复杂度成为了nlogn

范德蒙矩阵计算逆矩阵又减轻了拉格朗日插值法的复杂度。

十分神奇。

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath> #include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue> using namespace std; #define maxn 200005
#define Complex cp
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define mlog 16
#define inf (0x3f3f3f3f) int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} struct cp{
double x,y;//虚数可表示为 x+y*i i^2=-1
cp operator + (cp a) {return (cp){x+a.x,y+a.y};}
cp operator - (cp a) {return (cp){x-a.x,y-a.y};}
cp operator * (cp a) {return (cp){x*a.x-y*a.y,x*a.y+y*a.x};}
}a[maxn],b[maxn],c[maxn]; double pi=acos(-1.0); // π
int n,m,rev[maxn],len,ans[maxn];
char s[maxn]; void FFT(Complex * x,int n,int f)
{
F(i,0,n-1) if (rev[i]>i) swap(x[rev[i]],x[i]); //构造迭代的形式
for (int m=2;m<=n;m<<=1)
{
Complex wn=(Complex){cos(2.0*pi/m*f),sin(2.0*pi/m*f)}; //当前的主单位根
for (int i=0;i<n;i+=m)
{
Complex w=(Complex){1.0,0};
for (int j=0;j<(m>>1);++j)
{
Complex u=x[i+j],v=x[i+j+(m>>1)]*w;//计算对应的多项式的值
x[i+j]=u+v; x[i+j+(m>>1)]=u-v;
w=w*wn;//在复数域中旋转一个角度
}
}
}
} int main()
{
n=read();
scanf("%s",s); F(i,0,n-1) a[i].x=s[n-1-i]-'0';
scanf("%s",s); F(i,0,n-1) b[i].x=s[n-1-i]-'0';
m=1; n=2*n-1;
while (m<=n) m<<=1,len++; n=m;
F(i,0,n-1)
{
int t=i,ret=0;
F(j,1,len) ret<<=1,ret|=t&1,t>>=1;
rev[i]=ret;
}//二进制翻转,便于化分治为循环迭代
FFT(a,n,1); FFT(b,n,1); //FFT
F(i,0,n-1) c[i]=a[i]*b[i];
FFT(c,n,-1); //IFFT
F(i,0,n-1) ans[i]=(c[i].x/n)+0.5;//精度QAQ
F(i,0,n-1) ans[i+1]+=ans[i]/10,ans[i]%=10;//进位QwQ
n++;
while (!ans[n]&&n) n--;
D(i,n,0) printf("%d",ans[i]);
}

  

BZOJ 2179 FFT快速傅立叶 ——FFT的更多相关文章

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

    2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3308  Solved: 1720 Description 给出两个n位 ...

  2. bzoj 2179: FFT快速傅立叶 -- FFT

    2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MB Description 给出两个n位10进制整数x和y,你需要计算x*y. Input ...

  3. 【bzoj2179】FFT快速傅立叶 FFT模板

    2016-06-01  09:34:54 很久很久很久以前写的了... 今天又比较了一下效率,貌似手写复数要快很多. 贴一下模板: #include<iostream> #include& ...

  4. bzoj 2179 FFT快速傅立叶 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2179 默写板子,注释的是忘记的地方. 代码如下: #include<iostream& ...

  5. BZOJ2179:FFT快速傅立叶(FFT)

    Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出 ...

  6. 【bzoj2179】FFT快速傅立叶 FFT

    题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出 输出一行,即x*y的结果. 样例 ...

  7. BZOJ2179: FFT快速傅立叶 FFT实现高精度乘法

    Code: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring ...

  8. BZOJ 2179: FFT快速傅立叶

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

  9. 【BZOJ2179】FFT快速傅立叶

    [BZOJ2179]FFT快速傅立叶 Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位 ...

随机推荐

  1. [原创] SOAP UI 创建SOAP工程进行接口测试

    下载及安装 1. 登录http://www.soapui.org/ 2. 鼠标移动到导航头的Downloads选项 3. 点击SOAP UI 4. 下载页面 新建项目 创建项目 1. 创建项目很简单. ...

  2. [Tomcat]如何清理缓存

    步骤: 1.进入tomcat文件夹 2.找到work目录 3.work目录下有个catalina目录 4.将catalina目录整个删除

  3. 为 Azure 应用服务配置连续部署工作流

    本快速入门介绍了如何将应用服务 GitHub 集成以实现连续部署工作流.在本教程中完成的所有操作均符合1元试用条件. 本快速入门介绍了如何将应用服务 GitHub 集成以实现连续部署工作流.在本教程中 ...

  4. leetcode 4.两个排序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums ...

  5. The - Modcrab——使用贪心策略

    一.题目信息 The - Modcrab 简单翻译一下:Vova有生命值h1,每次攻击值为a1,每瓶药水恢复生命值c1;Modcrab有生命值h2,每次攻击值为a2.在每个关卡开始,Vova有两种选择 ...

  6. 第八篇:cx_Oracle出现的问题

    1.cx_Oracle.DatabaseError: ORA-24315: illegal attribute type 2.cx_Oracle.InterfaceError: Unable to a ...

  7. 公共Service的抽取小例

    package cn.sxx.service; import java.util.List; public interface BaseService<T,Q> { public void ...

  8. pseudogene|鉴定功能基因|expressed se|quence tag

    基因 (鉴定DNA:可以直接利用DNA序列鉴别基因,但存在3个问题) 1.intron太长(使用用来连接的算法不可及) 2.因为通常功能基因的第一个oxen中有非编码区和启动子最后一个oxen中有终止 ...

  9. lru缓存测试类

    package demo.mytest; import java.io.Serializable;import java.util.LinkedHashMap;import java.util.con ...

  10. PHP+Mysql实现分页

    我们在项目开发的过程中避免不了使用分页功能,拿php来说,现在市面上有很多大大小小的php框架,当然了分页这种小功能这些框架中都是拿来直接可以用的. 这些框架的分页功能使用都很方便,配置一下分页所需参 ...