随便代换一下把它变成多项式乘法,及$C[T]=\sum_{i=0}^{T}A[i]×B[T-i]$这种形式,然后FFT求一下就可以啦

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define read(x) x=getint()
  6. using namespace std;
  7. const int N = 400003;
  8. const double Pi = acos(- 1.0);
  9. int getint() {
  10. int k = 0, fh = 1; char c = getchar();
  11. for(; c < '0' || c > '9'; c = getchar())
  12. if (c == '-') fh = -1;
  13. for(; c >= '0' && c <= '9'; c = getchar())
  14. k = k * 10 + c - '0';
  15. return k * fh;
  16. }
  17. struct cp {
  18. double r, i;
  19. cp (double _r = 0.0, double _i = 0.0) : r(_r), i(_i) {}
  20. cp operator + (const cp &x) {return cp(r + x.r, i + x.i);}
  21. cp operator - (const cp &x) {return cp(r - x.r, i - x.i);}
  22. cp operator * (const cp &x) {return cp(r * x.r - i * x.i, r * x.i + i * x.r);}
  23. };
  24. cp A[N], u, t;
  25. int rev[N];
  26. void DFT(cp *a, int n, int flag) {
  27. for(int i = 0; i < n; ++i) A[rev[i]] = a[i];
  28. for(int i = 0; i < n; ++i) a[i] = A[i];
  29. for(int m = 2; m <= n; m <<= 1) {
  30. cp wn(cos(2.0 * Pi / m * flag), sin(2.0 * Pi / m * flag));
  31. int mid = m >> 1;
  32. for(int i = 0; i < n; i += m) {
  33. cp w(1.0);
  34. for(int j = 0; j < mid; ++j) {
  35. u = a[i + j], t = a[i + j + mid] * w;
  36. a[i + j] = u + t;
  37. a[i + j + mid] = u - t;
  38. w = w * wn;
  39. }
  40. }
  41. }
  42. if (flag == -1)
  43. for(int i = 0; i < n; ++i)
  44. a[i].r /= n;
  45. }
  46. void init(int &n) {
  47. int k = 1, ret, L = 0;
  48. for(; k < n; k <<= 1, ++L);
  49. n = k;
  50. for(int i = 0; i < n; ++i) {
  51. k = i; ret = 0;
  52. for(int j = 0; j < L; ++j)
  53. ret <<= 1, ret |= k & 1, k >>= 1;
  54. rev[i] = ret;
  55. }
  56. }
  57. void FFT(int *a, int *b, int *c, int la, int lb) {
  58. static cp x[N], y[N];
  59. int len = la + lb - 1;
  60. init(len);
  61. for(int i = 0; i < len; ++i)
  62. x[i].r = a[i], x[i].i = 0;
  63. for(int i = 0; i < len; ++i)
  64. y[i].r = b[i], y[i].i = 0;
  65. DFT(x, len, 1); DFT(y, len, 1);
  66. for(int i = 0; i < len; ++i)
  67. x[i] = x[i] * y[i];
  68. DFT(x, len, -1);
  69. for(int i = 0; i < len; ++i)
  70. c[i] = (int) (x[i].r + 0.5);
  71. }
  72. int x[N], y[N], a[N], n;
  73. int main() {
  74. read(n);
  75. for(int i = 0; i < n; ++i)
  76. read(x[i]), read(y[i]);
  77. for(int i = 0; i < n; ++i)
  78. a[i] = x[n - i - 1];
  79. FFT(y, a, x, n, n);
  80. for(int i = 0; i < n; ++i)
  81. a[i] = x[n - i - 1];
  82. for(int i = 0; i < n; ++i)
  83. printf("%d\n", a[i]);
  84. return 0;
  85. }

233

【BZOJ 2194】快速傅立叶之二的更多相关文章

  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: 快速傅立叶之二

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

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

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

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

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

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

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

  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 快速傅立叶变换之二 | FFT

    BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...

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

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

  10. 【BZOJ】2194: 快速傅立叶之二

    http://www.lydsy.com/JudgeOnline/problem.php?id=2194 题意:求$c[k]=\sum_{k<=i<n} a[i]b[i-k], n< ...

随机推荐

  1. AC日记——删除单词后缀 openjudge 1.7 20

    20:删除单词后缀 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个单词,如果该单词以er.ly或者ing后缀结尾, 则删除该后缀(题目保证删除后缀后的单词长度不为0), 否 ...

  2. java内存设置

    在上边红色框内加入java内存设置命令: -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m

  3. url编码base编码解码十六进制

    0x25346425353425343525333525343325366125343525373725346425353125366625373825346425343425363725346225 ...

  4. JSOI Round 2题解

    强行一波题解骗一个访问量好了... http://blog.csdn.net/yanqval/article/details/51457302 http://absi2011.is-programme ...

  5. 使用 JavaScript File API 实现文件上传

    概述 以往对于基于浏览器的应用而言,访问本地文件都是一件头疼的事情.虽然伴随着 Web 2.0 应用技术的不断发展,JavaScript 正在扮演越来越重要的角色,但是出于安全性的考虑,JavaScr ...

  6. 弹性返回顶部JS代码

    弹性返回顶部JS代码 弹性返回顶部JS代码点击下载

  7. Java集合系列:-----------05LinkedList的底层实现

    前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类--LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList ...

  8. HP “云图”GPU虚拟化工作站解决方案

    HP PCS ”云图”GPU虚拟化工作站解决方案 ——将图形计算从桌面移到数据中心 惠普云图形GPU虚拟化桌面系统是以用户为中心的私有云服务.除了保留了传统桌面虚拟化方案以集中设备为中心统一管理等优点 ...

  9. K8 系统中省市县数据表的设计可以反映出什么? 通过一个基础业务表的设计品味软件系统的整体架构

    1:没有严谨的Id思想,不变化的Id思想,看不见的Id的思想. 2:数据不严谨,没有上下级关系,没有树形结构,ParentId 的思想. 3:表之间的关系都是弱关联,基础数据一修改业务数据就容易乱套. ...

  10. window.history 和 DWZ 框架

    DWZ框架的ajax请求返回的一般都是一个HTML片段,整个页面是由一个个HTML片段组成的,可以由TAB切换其内容,但是只有一个body和HEAD,一般head 和 菜单栏是不会动的. 今天遇到一个 ...