BZOJ 2194 快速傅立叶变换之二


题意

给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\)。

题解

我们要把这个式子转换成多项式乘法的形式。

一个标准的多项式乘法是这样的:

\[c_k = \sum_{i = 0}^{k} a[i] * b[k - i]
\]

来看看原式:

\[c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]
\]

将a翻转得到a':

\[c_k = \sum_{i = k}^{n - 1} a'[n - 1 - i] * b[i - k]
\]

调整求和指标:

\[c_k = \sum_{i = 0}^{n - k - 1} a'[n - k - 1 - i] * b[i]
\]

那么求出\(c_k\),之后取\(c\)的前\(n\)位,倒着输出即可。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <complex>
  5. #define space putchar(' ')
  6. #define enter putchar('\n')
  7. using namespace std;
  8. typedef long long ll;
  9. template <class T>
  10. void read(T &x){
  11. char c;
  12. bool op = 0;
  13. while(c = getchar(), c < '0' || c > '9')
  14. if(c == '-') op = 1;
  15. x = c - '0';
  16. while(c = getchar(), c >= '0' && c <= '9')
  17. x = x * 10 + c - '0';
  18. if(op) x = -x;
  19. }
  20. template <class T>
  21. void write(T x){
  22. if(x < 0) putchar('-'), x = -x;
  23. if(x >= 10) write(x / 10);
  24. putchar('0' + x % 10);
  25. }
  26. const int N = 1000005;
  27. const double PI = acos(-1);
  28. typedef complex<double> cp;
  29. int len, ta[N], tb[N], res[N];
  30. cp omg[N], inv[N];
  31. void init(int n){
  32. for(int i = 0; i < n; i++){
  33. omg[i] = cp(cos(2 * PI * i / n), sin(2 * PI * i / n));
  34. inv[i] = conj(omg[i]);
  35. }
  36. }
  37. void fft(cp *a, int n, cp *omg){
  38. int lim = 0;
  39. while((1 << lim) < n) lim++;
  40. for(int i = 0; i < n; i++){
  41. int t = 0;
  42. for(int j = 0; j < lim; j++)
  43. if(i >> j & 1) t |= 1 << (lim - j - 1);
  44. if(i < t) swap(a[i], a[t]);
  45. }
  46. for(int l = 2; l <= n; l *= 2){
  47. int m = l / 2;
  48. for(cp *p = a; p != a + n; p += l)
  49. for(int i = 0; i < m; i++){
  50. cp t = omg[n / l * i] * p[m + i];
  51. p[m + i] = p[i] - t;
  52. p[i] += t;
  53. }
  54. }
  55. }
  56. void multiply(){
  57. static cp a[N], b[N];
  58. for(int i = 0; i < len; i++)
  59. a[i].real(ta[i]), b[i].real(tb[i]);
  60. int n = 1;
  61. while(n < 2 * len) n *= 2;
  62. init(n);
  63. fft(a, n, omg);
  64. fft(b, n, omg);
  65. for(int i = 0; i < n; i++)a[i] *= b[i];
  66. fft(a, n, inv);
  67. for(int i = 0; i < n; i++)
  68. res[i] = floor(a[i].real() / n + 0.5);
  69. }
  70. int main(){
  71. read(len);
  72. for(int i = 0; i < len; i++)
  73. read(ta[i]), read(tb[i]);
  74. for(int i = 0, j = len - 1; i < j; i++, j--)
  75. swap(ta[i], ta[j]);
  76. multiply();
  77. for(int i = len - 1; i >= 0; i--)
  78. write(res[i]), enter;
  79. return 0;
  80. }

BZOJ 2194 快速傅立叶变换之二 | FFT的更多相关文章

  1. bzoj 2194: 快速傅立叶之二 -- FFT

    2194: 快速傅立叶之二 Time Limit: 10 Sec  Memory Limit: 259 MB Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k & ...

  2. bzoj 2194 快速傅立叶之二 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2194 如果把 a 序列翻转,则卷积得到的是 c[n-i],再把得到的 c 序列翻转即可. 代 ...

  3. BZOJ 2194 快速傅立叶之二 ——FFT

    [题目分析] 咦,这不是卷积裸题. 敲敲敲,结果样例也没过. 看看看,卧槽i和k怎么反了. 艹艹艹,把B数组取个反. 靠靠靠,怎么全是零. 算算算,最终的取值范围算错了. 交交交,总算是A掉了. [代 ...

  4. BZOJ.2194.快速傅立叶之二(FFT 卷积)

    题目链接 \(Descripiton\) 给定\(A[\ ],B[\ ]\),求\[C[k]=\sum_{i=k}^{n-1}A[i]*B[i-k]\ (0\leq k<n)\] \(Solut ...

  5. [BZOJ]2194: 快速傅立叶之二

    题目大意:给定序列a,b,求序列c满足c[k]=sigma(a[i]*b[i-k]) (k<=i<n).(n<=10^5) 思路:观察发现就是普通的卷积反一反(翻转ab其中一个后做卷 ...

  6. 【刷题】BZOJ 2194 快速傅立叶之二

    Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...

  7. bzoj 2194: 快速傅立叶之二【NTT】

    看别的blog好像我用了比较麻烦的方法-- (以下的n都--过 \[ c[i]=\sum_{j=i}^{n}a[i]*b[j-i] \] 设j=i+j \[ c[i]=\sum_{j=0}^{n-i} ...

  8. 【BZOJ 2194】2194: 快速傅立叶之二(FFT)

    2194: 快速傅立叶之二 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1273  Solved: 745 Description 请计算C[k]= ...

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

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

随机推荐

  1. wpf在image控件上快速显示内存图像

    这是在博客园的第一篇文章 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包含图像头等信息)快速显示到界面,那么 ...

  2. JavaScript学习要点

    Javascript相关内容 1.序列化--json - stringify() 将对象转换为字符串 - parse() 将字符串转换为对象 list=[11,22,33,44,55]; 结果:(5) ...

  3. 2019第十届蓝桥杯 E题 迷宫

    /*输入 30 50 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001 ...

  4. 搭建 Digital Ocean 服务器

    作为程序员,搭建属于自己的服务器可以部署自己的网站,可以配置代理***,了解国际前沿科技:一些高性能的服务器还可以完成一些云计算.深度学习模型的训练任务. DigitalOcean 服务启动 注册 D ...

  5. 工具 | Sublime

    Sublime 前言 妈耶..\(Sublime\)的界面真的是太好看啦哭哭.. 我永远喜欢Sublime! 强推Sublime... 正文 自从暑假用上的Ubontu 一开始用的是\(gedit\) ...

  6. Mysql数据库的四大特性

    Mysql数据库事务的四大特性(ACID) 事务:把一组密不可分的操作系列集合在一起,这些操作要么全部执行,要么全部不执行. 1.原子性:事务是内定义的操作是一个整体,是不可分割的. 2.一致性:事务 ...

  7. Ubuntu 1804 本地显示远程服务器文件

    本地是 Ubuntu 1804 最近想查看服务器上的图片,之前都是scp到本地,感觉太麻烦,于是查到有一种方法,ssh图形界面那种: 1.在File 界面下,左侧文件栏的最后一列有 “+ Other ...

  8. axios常用操作

    axios常用操作 一:函数化编程 1:编写可复用的方法 axios(config)的方法中,有必须的url参数和非必须的options参数.所以我们可以先写一个接受这两个参数的方法,在这个方法中我们 ...

  9. ListView高效分页

    使用控件自带的分页功能时,会先将所查询的数据全部加载出来,若数据量较大,则造成浏览器端等待时间过长. 然而在庞大的数据量,用户所需要的不过是那么几条,甚至只要其中的一条数据,所以,为了减少开销,每次只 ...

  10. 项目Beta冲刺(团队)第三天

    1.昨天的困难 记住密码打勾之后点击登录记住密码这四个字会变成省略号 点赞点击以后本应该呈现的爱心形状变成了方块 2.今天解决的进度 成员 进度 陈家权 私信模块探索ing,回复详情界面设计 赖晓连 ...