「BZOJ2194」快速傅立叶之二

2015年4月29日3,8300

Description

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

Input

       第一行一个整数N,接下来N行,第i+2..i+N-1行,每行两个数,依次表示a[i],b[i] (0 < = i < N)。

Output

输出N行,每行一个整数,第i行输出C[i-1]。

Sample Input

5
3 1
2 4
1 1
2 4
1 4

Sample Output

24
12
10
6
1

思路分析 :

  初看题目所要求的式子,很像卷积, f(x) * g(x) = sigma(f(x) g(t-x))  那么我们只要将 b数组变换一下即可, 另 d[i] = b[n-i-1] , 则a[i]*b[k-i] = a[i]*b[n-1-(n+k-i-1)] = a[i]*d[n+k-1-i] ( k-1 < i < n) 这不就是一个标准的卷积了吗,fft 即可

代码示例 :(未测试)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int maxn = 3e5+5;
  5. const double pi = acos(-1.0);
  6.  
  7. int n;
  8. struct Complex{
  9. double x, y;
  10. Complex (double _x=0, double _y=0):x(_x), y(_y){}
  11. Complex operator -(const Complex &b)const{
  12. return Complex(x-b.x, y-b.y);
  13. }
  14. Complex operator +(const Complex &b)const{
  15. return Complex(x+b.x, y+b.y);
  16. }
  17. Complex operator *(const Complex &b)const{
  18. return Complex(x*b.x-y*b.y, x*b.y+y*b.x);
  19. }
  20. };
  21. Complex x1[maxn], x2[maxn];
  22. void change(Complex y[], int len){
  23. for(int i = 1, j = len/2; i < len-1; i++){
  24. if (i < j) swap(y[i], y[j]);
  25. int k = len/2;
  26. while(j >= k){
  27. j -= k;
  28. k /= 2;
  29. }
  30. if (j < k) j += k;
  31. }
  32. }
  33.  
  34. void fft(Complex y[], int len, int on){
  35. change(y, len);
  36. for(int h = 2; h <= len; h <<= 1){
  37. Complex wn(cos(-on*2*pi/h), sin(-on*2*pi/h));
  38. for(int j = 0; j < len; j += h){
  39. Complex w(1, 0);
  40. for(int k = j; k < j+h/2; k++){
  41. Complex u = y[k];
  42. Complex t = w*y[k+h/2];
  43. y[k] = u+t;
  44. y[k+h/2] = u-t;
  45. w = w*wn;
  46. }
  47. }
  48. }
  49. if (on == -1){
  50. for(int i = 0; i < len; i++)
  51. y[i].x /= len;
  52. }
  53. }
  54.  
  55. int main () {
  56.  
  57. cin >> n;
  58. for(int i = 0; i < n; i++) scanf("%lf%lf", &x1[i].x, &x2[n-i-1].x);
  59. int len = 1;
  60. while(len < 2*n) len <<= 1;
  61.  
  62. fft(x1, len, 1); fft(x2, len, 1);
  63. for(int i = 0; i < len; i++) x1[i] = x1[i]*x2[i];
  64. fft(x1, len, -1);
  65.  
  66. for(int i = n-1; i < 2*n-1; i++){
  67. int x = (int)(x1[i].x+0.5);
  68. printf("%d\n", x);
  69. }
  70. return 0;
  71. }

简单的 FFT 变形 - BZOJ 2194的更多相关文章

  1. BZOJ 2194 快速傅立叶变换之二 | FFT

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

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

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

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

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

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

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

  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 FFT

    思路: 题目中给的是差值一定的 那么就把b数组倒一下 不就变成 i+j=k(k为定值的了嘛) 嗯 然后搞个FFT //By SiriusRen #include <cstdio> #inc ...

  8. 实现了一个简单的cage变形器

    今天实现了一个简单变形器,可以用一个网格的形状影响另一个网格的形状. 如图,蓝色网格的形状被灰色网格操控. 当前的算法非常简单,就是计算蓝色网格每个点到灰色网格每个点的距离,以距离x次方的倒数作为权重 ...

  9. 利用GDI+处理图像,包括图像的的裁剪显示、转置、镜像、简单旋转、变形等。

    一.图像的裁剪显示:有时程序需要显示图像的一部分而不是全部.实例代码如下: CDC* pDC = GetDC(); Graphics graph(pDC->GetSafeHdc()); Imag ...

随机推荐

  1. java异常处理格式

    异常处理的5个关键字 try ,catch, finally throw, throws   我的总结: 捕获异常:先捕获小异常再捕获大异常. 程序是调出来的,不是写出来的:多测试是程序员的必修课. ...

  2. 【u128】又一个数字游戏

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小明拿出了一个素数集合,{2, 3, 5, 7, 11, 13, -, 127, -},他发现,从小到 ...

  3. sublime text3神器插件

    (首先安装)Package Control  Package Control,就像 Linux 下的 apt-get 和 yum 一样,它是 Sublime Text 的包管理器 1.Emmet 是一 ...

  4. 154th LeetCode Weekly Contest

    A B D均比较简单.先说C题 K-Concatenation Maximum Sum Given an integer array arr and an integer k, modify the ...

  5. ZR1050

    ZR1050 http://www.zhengruioi.com/problem/1030 题目大意: 给定一棵带点权的树,求所有联通块的点权和的平方的和 \(n \le 10^5\) 题解 首先,关 ...

  6. H3C配置Header进入用户视图的提示信息--系统视图

                      incoming:登录终端用户界面时的提示信息. Header 3种类型     login:登录验证时的提示信息.    Vty模式                ...

  7. Command failed: git -c core.longpaths=true config --get remote.origin.url

    「Unable to Connect to GitHub.com For Cloning」 Error: Command failed: git -c core.longpaths=true conf ...

  8. 【Docker】镜像分层存储与镜像精简

    Linux操作系统 Linux操作系统由内核空间和用户空间组成. 内核空间是kernel,用户空间是rootfs, 不同Linux发行版的区别主要是rootfs.比如 Ubuntu 14.04 使用 ...

  9. IAP升级

    一.IAP原理 1.在正常情况下,程序运行路流程: 和STM32类似,STM8内部闪存(FLASH)地址起始于 0x8000(STM32是0x08000000),一般情况下,程序文件就从此地 址开始写 ...

  10. JMeter数据库测试计划

    在系统上安装数据库服务器之后. 按着这些次序: 创建名为testdb的数据库. 创建表 - tb_user. 将记录插入到tb_user表中. 下图显示了创建的数据库及其记录. 注意:您需要将相应的J ...