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]。

题解:

求 $C_{k}=\sum a_{i}b_{i-k}$ 
卷积要求下标和要一定,然而这个情况下下标和并不是固定的.
为了让下标和固定,试着把 $b$ 给翻转一下,即 $b_{i}\Rightarrow b_{n-1-i}$
这样原来的式子就变为 $C_{k}=\sum a_{i}b_{n-1-(i-k)}$, 即 $C_{k}=\sum a_{i}b_{n-1-i+k}$
那么,下标和就是 $n-1+k$ 了,这个是固定的
将反转过来的 $b$ 与 $a$ 相乘后,$C_{k}$ 的答案就在相乘后多项式的$n-1+k$ 项了
试试把 $a$ 翻转过来,即 $a_{i}\Rightarrow a_{n-1-i}$ 那么原式为$C_{k}=\sum a_{n-1-i}b_{i-k}$
对于 $k$ 的下标和为 $n-1-k$,效果是相同的 
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cstring>
  5. #define setIO(s) freopen(s".in","r",stdin)
  6. #define maxn 200000
  7. #define pi 3.1415926535898
  8. using namespace std;
  9. int len=1,l,r[maxn<<1];
  10. int ans[maxn];
  11. char str1[maxn],str2[maxn];
  12. struct Cpx{
  13. double x,y;
  14. Cpx(double t1=0,double t2=0){x=t1,y=t2;}
  15. }A[maxn<<1],B[maxn<<1],C[maxn<<1],BB[maxn<<1];
  16. Cpx operator+(Cpx a,Cpx b){ return Cpx(a.x+b.x,a.y+b.y);}
  17. Cpx operator-(Cpx a,Cpx b){ return Cpx(a.x-b.x,a.y-b.y);}
  18. Cpx operator*(Cpx a,Cpx b){ return Cpx(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
  19. void FFT(Cpx *a,int n,int flag){
  20. for(int i=0;i<n;++i) if(i<r[i]) swap(a[i],a[r[i]]);
  21. for(int mid=1;mid<n;mid<<=1){
  22. Cpx wn(cos(pi/mid),flag*sin(pi/mid)),x,y;
  23. for(int j=0;j<n;j+=(mid<<1)){
  24. Cpx w(1,0);
  25. for(int k=0;k<mid;++k){
  26. x=a[j+k],y=w*a[j+mid+k];
  27. a[j+k]=x+y,a[j+mid+k]=x-y;
  28. w=w*wn;
  29. }
  30. }
  31. }
  32. }
  33. int main(){
  34. //setIO("input");
  35. int n;
  36. scanf("%d",&n);
  37. for(int i=0;i<n;++i) scanf("%lf",&A[i].x),scanf("%lf",&BB[i].x);
  38. for(int i=0;i<n;++i) B[i].x=BB[n-i-1].x;
  39. while(len<n+n) len<<=1,++l;
  40. for(int i=0;i<len;++i)
  41. r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  42. FFT(A,len,1),FFT(B,len,1);
  43. for(int i=0;i<=len;++i) C[i]=A[i]*B[i];
  44. FFT(C,len,-1);
  45. for(int i=0;i<=len;++i) ans[i]=(int)(C[i].x/len+0.5);
  46. for(int i=0;i<n;++i) printf("%d\n",ans[i+n-1]);
  47. return 0;
  48. }

  

BZOJ2194: 快速傅立叶之二 FFT_卷积的更多相关文章

  1. BZOJ2194: 快速傅立叶之二(NTT,卷积)

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1776  Solved: 1055[Submit][Status][Discuss] Descript ...

  2. bzoj2194 快速傅立叶之二 ntt

    bzoj2194 快速傅立叶之二 链接 bzoj 思路 对我这种和式不强的人,直接转二维看. 发现对\(C_k\)贡献的数对(i,j),都是右斜对角线. 既然贡献是对角线,我们可以利用对角线的性质了. ...

  3. [bzoj2194]快速傅立叶之二_FFT

    快速傅立叶之二 bzoj-2194 题目大意:给定两个长度为$n$的序列$a$和$b$.求$c$序列,其中:$c_i=\sum\limits_{j=i}^{n-1} a_j\times b_{j-i} ...

  4. bzoj2194: 快速傅立叶之二

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  5. bzoj千题计划256:bzoj2194: 快速傅立叶之二

    http://www.lydsy.com/JudgeOnline/problem.php?id=2194 相乘两项的下标 的 差相同 那么把某一个反过来就是卷积形式 fft优化 #include< ...

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

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

  7. BZOJ2194:快速傅立叶之二(FFT)

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

  8. BZOJ2194 快速傅立叶之二 【fft】

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

  9. 2018.11.18 bzoj2194: 快速傅立叶之二(fft)

    传送门 模板题. 将bbb序列反过来然后上fftfftfft搞定. 代码: #include<bits/stdc++.h> #define ri register int using na ...

随机推荐

  1. vc++如何创建程序--利用快捷键进行多行注释

    Eclipse同时注释多行①:ctrl+/或 ②:ctrl+shift+/ : Visual studio先按ctrl+k 再按 ctrl+c 2.在VC++6.0中需要自己设置快捷键,设置方法链接如 ...

  2. JavaScript 原型 原型链

    一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 var o1 = ...

  3. Project Euler 32 Pandigital products

    题意:找出所有形如 39 × 186 = 7254 这种,由 1 - 9,9个数字构成的等式的和,注意相同的积不计算两次 思路:如下面两种方法 方法一:暴力枚举间断点 /*************** ...

  4. POJ 1061 青蛙的约会( 拓欧经典题 )

    链接:传送门 思路:简单拓展欧几里德,分析后可以得到方程 x + m * t = y + n * t + L * s( s控制圈数,t代表跳t次会碰面 ),经过化简可以得到 ( n - m ) * t ...

  5. 记Spring搭建功能完整的个人博客「Oyster」全过程[其二] Idea中Maven+SpringBoot多模块项目开发的设计和各种坑(模块间依赖和打包问题)

    大家好嘞,今天闲着没事干开写写博客,记录一下Maven+SpringBoot的多模块设计和遇到的坑. 多模块设计 简单说明一下截止目前的需求: 需要RESTful API:对文章.标签.分类和评论等的 ...

  6. [LUOGU2730] 魔板

    搜索水题.因为只有8个数,排列一共有40320种,直接bfs,判重就行了. 但是判重的时候直接用8进制表示的话要88的bool数组.这种操作太low了,于是我们可以用康托展开,降成8!. 康托展开其实 ...

  7. PHP 闭包之变量作用域

      在项目中,难免会遇到闭包的形式,那么在闭包中,变量的作用域到底是怎么样的呢.下面有几个简单的例子. e1 function test_1() { $a = 'php'; $func = funct ...

  8. Problem 11

    Problem 11 # Problem_11.py """ In the 20×20 grid below, four numbers along a diagonal ...

  9. Python面向对象之静态方法、静态方法与类方法

    静态属性: 类调用函数属性时,需要先将类实例化,再将实例作为函数属性传入:类的实例调用函数属性时需要在后面加括号. class Building: def __init__(self, name, o ...

  10. Android学习总结(3)——Handler深入详解

    什么是Handler Handler是Android消息机制的上层接口,它为我们封装了许多底层的细节,让我们能够很方便的使用底层的消息机制.Handler的最常见应用场景之一便是通过Handler在子 ...