当前位置: 首页 > 编程日记 > 正文

HDU1402(FFT入门)

题目链接:http://acm.hdu.edu.cn/status.php?user=Reykjavik11207&pid=1402&status=5

本题数据范围为5e4,常规方法O(n2)肯定是不行的。

FFT是离散傅里叶变换DFT的快速形式

对多项式f(x) = a0 + a1x + a2x2 + ··· +an-1xn-1,有两种表示法:

系数表达式 : (a0 , a1 , ··· , an-1)

由于n-1次多项式需要n个点来确定

所以可以用点值表达式 : ( (x0,f(x0)) , (x1,f(x1)) , ··· , (xn-1,f(xn-1)) ) 来表示

要获得点值表达式,首先选取n个x值获得对应f(x)的值

将f(x)分为奇偶两个部分f(x) = a0 + a2x2 + ··· + an-2xn-2 + a1x + a3x3 + ··· + an-1xn-1

f1(x) = a0 + a2x + ··· + an-2 x(n-2)/2

   f2(x) = a1 + a3x + ··· + an-1 x(n-1)/2

则有f(x) = f1(x2) + xf2(x2

f1(x)与f2(x)再分别分解,直至到常数ai为止

到了这里,复杂度并没有降低,反而由于x的整次幂未知还升高了,可以发现x = 1可以使式子更简单,因为1的多少次幂都是1,然后就是-1,但只有2个数远远不够,所以引入了复数。

是复平面单位圆上逆时针按k从小到大均匀分布的复根,间隔角度为2π/n,所以有:

= cos(2kπ/n) + i * sin(2kπ/n) ,计算复根的k次幂显然较实数更为方便,(但STL中三角函数也不是O(1),是多少我也不太懂,总之我把wnk函数放三重循环里就超时了)。

容易看出它的周期为n,即满足

同时还有以下性质:  =  cos(2kπ/n + π) + i * sin(2kπ/n + π) =

=  cos(2*2k*π/n) + i * sin(2*2k*π/n) = cos(2kπ/(n/2)) + i * sin(2kπ/(n/2)) =

故f(wnk+n/2) = f1(wn/2k) - wnk f2(wn/2k)

以n = 4为例:

显然n必须为2的整数次幂

原来第i个元素的位置经过变换后的位置为i的二进制按长度翻转,

如上图中(0)10 = (00)2   翻转 ->   (00)2 = (0)10

(1)10 = (01)2   翻转 ->   (10)2 = (2)10

(2)10 = (10)2   翻转->    (01)2 = (1)10

(3)10 = (11)2   翻转->    (11)2 = (3)10

然后自底向上代入函数中,得到n个f(x)值

另一个数同理得到n个g(x)值

F(x) = f(x)*g(x),则F(xi) = f(xi)*g(xi)

接下来就要用傅里叶逆变换IDFT求出F(x)的系数表达式

变换矩阵

的逆矩阵为

进而得到F(x)的系数表达式,即为结果

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1 << 17;
const double pi = acos(-1.0);
const double eps = 1e-4;//这个...精度问题,本来用的1e-8就WA了
int n,len;
int rev(int x)//二进制翻转
{int res = 0;for(int i = 0; i < len; i++)res += ((x >> i) & 1) << (len - 1 - i);return res;
}
struct Complex
{double real,image;Complex(double r = 0,double i = 0){real = r;image = i;}Complex operator + (const Complex &t){return Complex(real + t.real, image + t.image);}Complex operator - (const Complex &t){return Complex(real - t.real, image - t.image);}Complex operator * (const Complex &t){return Complex(real * t.real - image * t.image, real * t.image + t.real * image);}
};
Complex wnk(double n,double k)
{return Complex(cos(2*pi*k/n), sin(2*pi*k/n));
}
void fft(Complex y[], int dft)
{Complex t1,t2;for(int i = 1; i < n; i <<= 1){Complex W(1,0), w = wnk(2*i,dft);for(int k = 0; k < i; k++){for(int j = k; j < n; j += i<<1){t1 = y[j] + W * y[j+i];t2 = y[j] - W * y[j+i];y[j] = t1;y[j+i] = t2;}W = W * w;}}if(dft == -1){for(int i = 0; i < n; i++)y[i].real /= n;}
}
Complex a1[N],a2[N],a[N];
int ans[N];
char stra[N>>1],strb[N>>1];
int main()
{while(~scanf("%s %s",stra,strb)){int lena = strlen(stra);int lenb = strlen(strb);len = log10(lena+lenb)/log10(2) + 1 + eps;n = 1 << len;for(int i = 0; i < lena; i++)a1[rev(i)] = Complex((double)(stra[lena-i-1] - '0'), 0);for(int i = lena; i < n; i++)a1[rev(i)] = Complex(0,0);for(int i = 0; i < lenb; i++)a2[rev(i)] = Complex((double)(strb[lenb-i-1] - '0'), 0);for(int i = lenb; i < n; i++)a2[rev(i)] = Complex(0,0);fft(a1,1);fft(a2,1);for(int i = 0; i < n; i++)a[rev(i)] = a1[i] * a2[i];fft(a,-1);int t = 0;for(int i = 0; i < n; i++){ans[n - 1 - i] = ((int)(a[i].real + eps) + t) % 10;t = ((int)(a[i].real + eps) + t) / 10;}bool flag = 0;for(int i = 0; i < n - 1; i++){if(ans[i])flag = 1;if(!flag)continue;printf("%d",ans[i]);}printf("%d\n",ans[n-1]);}return 0;
}

(W0n)0(W1n)0(Wn1n)0(W0n)1(W1n)1(Wn1n)1⋯⋱⋯(W0n)n−1(W1n)n−1⋮(Wn−1n)n−1⎤⎦⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢a0a1⋮an−1⎤⎦⎥⎥⎥⎥

(W0n)0(W1n)0(Wn1n)0(W0n)1(W1n)1(Wn1n)1⋯⋱⋯(W0n)n−1(W1n)n−1⋮(Wn−1n)n−1⎤⎦⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢a0a1⋮an−1⎤⎦⎥⎥⎥⎥

转载于:https://www.cnblogs.com/westwind1005/p/8886973.html

相关文章:

python怎么读_如何用Python读写文件

前面我们已经介绍了很多Python相关的基础知识&#xff0c;大家是不是对Python已经有了进一步认识了呢&#xff1f;作为人工智能时代的热门编程语言&#xff0c;开始接触并学习Python的孩子越来越多&#xff0c;家长们都不想让自己的孩子落于人后&#xff0c;近期前来找陈老师咨…

什么是区块链智能合约?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 自从2009年第一枚比特币诞生&#xff0c;九年多时间里&#xff0c;区块链技术正在被应用在人们生活的各方各面&#xff0c;从1.0时代的数字货币&…

python数据分析基础 余本国_Python数据分析基础

本书根据作者多年教学经验编写, 条理清楚, 内容深浅适中, 尽量让读者从实例出发, 结合课后练习, 少走弯路。本书涉及的内容主要包括Python数据类型与运算、流程控制及函数与类、Pandas库的数据处理与分析等。作者通过近三轮的教学&#xff0c;对Python3.x的基础知识进行了筛选和…

stm32F042 (二) 按键触发中断

已经实现GPIO口输出高低电平控制LED&#xff0c;这里实现按键触发中断来改变LED闪亮的频率&#xff0c;因为PB3连着LED&#xff0c;所以PB3的输出模式没有改变&#xff0c;随意选一个GPIO口PA7接按键产生中断。因为nucleo开发板是裸板&#xff0c;所以按键、上拉电阻是另找在面…

区块链和智能合约的关系

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 尽管比特币&#xff08;Bitcoin&#xff09;和以太坊&#xff08;Ethereum&#xff09;是经常被一起提及的两个词&#xff0c;但实际上&#xff0…

repo同步代码_iTOP-4412开发板android4.0代码下载和编译

Android4.0 源码可以从光盘&#xff0c;网盘获取稳定版本&#xff0c;也可以从 GitHub 下载我们的开发版本。GitHub 仅提供源码下载&#xff0c;不提供二进制下载&#xff0c;二进制文件存放在光盘和网盘中。基于迅为4412开发板6.3.1.1 repo 下载android 代码管理不同于 uboot,…

vue项目构建实战基础知识:SPA理解/RESTful接口介绍/static目录配置/axios封装/打包时map文件去除...

一、SPA 不是指水疗。是 single page web application 的缩写。中文翻译为 单页应用程序 或 单页Web应用&#xff0c;更多解释请自行搜索。 所有的前端人员都应该明白我们的页面的 url 构成&#xff1a;http://www.fengcms.com/index.html?namefungleo&old32#mylove/is/wo…

神奇的输入 while(cin....)如何在遇见换行之后进入下一层循环读入

1 cin>>m>>n;2 for(int i1;i<m;i){4 int x0;5 char ch ;6 while(ch!10) //在遇到换行之后进入下一层循环读入。7 {8 x;9 cin>>c[x]; 10 chgetchar(); 11 } 神奇的输入。 get skill&#xff01;转载于:https://www.cnblogs.com/zyker/p/588…

区块链中的“智能合约”有何应用?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 如刺金般闪耀的区块链时代&#xff0c;投资者的热潮还将持续升温&#xff0c;与此同时金融的大佬已经开始注意到区块链应用落地场景的实现&#xff…

米勒罗宾素性测试(Miller–Rabin primality test)

1 #include<iostream> //该程序为哥德巴赫猜&#xff08;想输出所有的组合&#xff09;2 #include<cmath>3 #include<cstdlib>4 #include<ctime>5 #include<cstdio>6 7 using namespace std;8 9 typedef unsigned long long ull; 10 typedef u…

Linux Linux程序练习十一(网络编程大文件发送UDP版)

//网络编程发送端--大文件传输&#xff08;UDP&#xff09; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h>#include <sys/types.h> #include <sys/socket.h> #include <n…

iic通信原理_电子知识之IIC通信原理和协议分享

IIC 的一些特征&#xff1a; 两条总线&#xff1a;串行数据总线(SDA)和串行时钟总线(SCL)真正的多主机总线连接到相同总线的ic数量只受到总线的最大电容400pF限制。串行8位双向数据在标准模式下可达100K bit/s快速模式400K bit/s,高速模式下3.4Mbit/s.数据有效性规定&#xff1…

以太坊核心概念

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊虚拟机&#xff08;EVM&#xff09; 以太坊虚拟机&#xff08;EVM&#xff09;是以太坊中智能合约的运行环境。它不仅被沙箱封装起来&#…

使用rest_framework写api接口的一些注意事项(axios发送ajax请求)

1. 类继承GenericAPIView&#xff0c;定义queryset 印象深刻的事&#xff1a;由于原来对于继承关系不太清楚&#xff0c;写接口 APIView/泛指GenericAPIView不太关注queryset没有设置渲染器&#xff1a;默认 [JSONRenderer,BrowsableAPIRenderer]BrowsableAPIRenderer&#xff…

iir数字滤波器_手把手教系列之一阶数字滤波器设计实现(附代码)

[导读] 前面分享了 IIR/FIR/mean/梳状数字滤波器的具体设计实现&#xff0c;这几种使用起来或许觉得计算量大&#xff0c;相对复杂。实际工程应用中通常有必要过滤来自传感器或音频流的数据&#xff0c;以抑制不必要的噪声。有的应用场景&#xff0c;可能只需要一个最简单的一阶…

正则表达式中$1,$2 ===算是什么意思

$1,$2...是表示的小括号里的内容 $1是第一个小括号里的 ,$2是第2个小括号里的 比如 /gai([\w]?)over([\d])/ 匹配 gainover123 $1 括号里的 n $2 第2个括号里的 123转载于:https://www.cnblogs.com/vertko/p/5888902.html

为什么以太坊能成为区块链2.0的代表之作?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链的学习进入到第四天&#xff0c;前三天学习比特币&#xff0c;分别从比特币的前世、货币属性和背后的区块链技术学习。 比特币是区块链的1…

(转)搭建企业内部yum仓库(centos6+centos7+epel源)

搭建企业内部yum仓库(centos6centos7epel源) 原文&#xff1a;https://www.cnblogs.com/nulige/p/6081192.html https://www.linuxidc.com/Linux/2017-11/148723.htm---------部署yum仓库与定制rpm包 1. 创建yum仓库目录mkdir -p /data/yum_data/cd /data/yum_data/#可以上传rp…

vs按f5没反应_《死神vs火影》中最受欢迎的游戏角色,仙鸣当之无愧上榜

hello&#xff01;大家好&#xff0c;又到了一日一度的杨某讲游戏环节啦&#xff0c;赶紧系好安全带&#xff0c;准备上车吧。《死神vs火影》作为一款深受广大群众欢迎的街机游戏&#xff0c;自然而然地涌现出了一系列知名游戏角色。那么&#xff0c;大多数人心目中最喜欢&…

IEC61850笔记--IEC61850应用入门(二)

IEC61850标准学习和调试&#xff0c;测试的记录文档&#xff0c;主要参考了IEC61850标准文档&#xff0c;《IEC61850应用入门(第二版)》&#xff0c;开源代码libIEC61850及libIEC61850说明文档。 IEC61850标准内容参考IEC61850标准文档&#xff0c;以及IEC61850标准介绍文档《I…

区块链赚钱的9种方式

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 物联网火了一段时间&#xff0c;人工智能火了一段时间&#xff0c;无人驾驶火了一段时间。现在&#xff0c;通通被区块链的风头盖住了&#xff0c;都…

7、在对象内部尽量直接访问实例变量

本文概要&#xff1a; 1、首先给出结论是&#xff1a;除了几种特殊情况外&#xff0c;在读取实例变量的时候采用直接访问的形式&#xff0c;而在设置实例变量的时候通过属性来做。 2、讲解了使用getter、setter的好处。 3、列举了几种上面提到的特殊情况&#xff1a;有时不能使…

linux python2和python3共存_linux-Centos7安装python3并与python2共存

1.查看是否已经安装PythonCentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5。使用 python -V 命令查看一下是否安装Python然后使用命令 which python 查看一下Python可执行文件的位置可见执行文件在/usr/bin/ 目录下&#xff0c;切换到该目录…

9月20号作业

转载于:https://www.cnblogs.com/kangy123/p/5890515.html

区块链以太坊五大开发工具,你喜欢哪个?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊&#xff08;Ethereum&#xff09;是运行智能合约的最受欢迎的分布式平台之一。因为虚拟货币近年来的发展&#xff0c;以太坊以区块链为基础引…

sublime text 3 中改变.vue文件的颜色

1、按 CtrlShiftP 2、输入install&#xff0c;选择install Package 3、输入vue&#xff0c;选择 vue syntax hightlight 如果上述方法不起作用&#xff0c;可以选择在下面连接中下载文件&#xff0c;手动安装 如何让你的.vue在sublime text 3 中变成彩色? 转载于:https://www…

nodejs端口被占用。

I had the same issue. I ran: $ ps aux | grep node to get the process id, then: $ sudo kill -9 followed by the process id to kill the process.转载于:https://www.cnblogs.com/facial/p/5893138.html

戴尔电脑管家_2020年笔记本电脑推荐指南:笔记本电脑应该怎么选?什么牌子的笔记本电脑更值得入手?...

笔记本电脑已经成为家家户户必不可少的移动装置了&#xff0c;作为一名互联网行业从业者&#xff0c;无论是居家还是工作也得有一台性价比较高的笔记本&#xff0c;才能满足工作需要了。接下来&#xff0c;跟大家唠一唠笔记本电脑的那些事儿~我将从以下几个方面进行介绍&#x…

行走在区块链上的智能合约

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 我和你打一个赌&#xff0c;我赌明天是雨天&#xff0c;你赌是晴天&#xff0c;赌注100大洋。假设明天是晴天&#xff0c;然后你跑过来管我要100大洋…

安装 telnet

yum install telnet-server yum install telnet service xinetd restart 查询是否正常启动telnet netstat -tnl |grep 23 telnet服务默认使用的23端口 转载于:https://www.cnblogs.com/gaobo543013306/p/8922021.html