题目链接

\(Descripiton\)

  给定\(A[\ ],B[\ ]\),求$$C[k]=\sum_{i=k}^{n-1}A[i]B[i-k]\ (0\leq k<n)$$

\(Solution\)

  (先令\(n=n-1\))

  首先往卷积上想。。

  \(i\)与\(i-k\)的差值是一定的,但是卷积的形式是$$C[k]=\sum_{i=1}^k A[i]
B[k-i]$$

  即\(i\)与\(k-i\)的和是一定的。

  于是考虑把一个数组反转一下,这里把\(B[\ ]\)反转,那么$$C[k]=\sum_{i=k}^n A[i]B[n+k-i]$$

  这样\(i\)与\(n+k-i\)的和就是一定的了,为\(n+k\),于是令$$D[n+k]=\sum_{i=k}^n A[i]
B[n+k-i]$$

  这样就可以\(FFT\)求\(D[\ ]\)了。

  $$D[n+k]=\sum_{i=0}^{n+k}A[i]*B[n+k-i]$$

  \(i=0\sim k-1\)和\(i=n+1\sim n+k\)时,要么\(A[i]=0\)要么\(B[i]=0\),没有影响。

  所以最后的\(C[k]=D[n+k]\)。

  另外这个好像可以(以后)再看看。

  1. //13148kb 1544ms
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <algorithm>
  6. #define gc() getchar()
  7. const int N=263000;//2^{18}=262144 > 2*1e5
  8. const double PI=acos(-1);
  9. int n;
  10. struct Complex
  11. {
  12. double x,y;
  13. Complex() {}
  14. Complex(double x,double y):x(x),y(y) {}
  15. Complex operator + (const Complex &a)const{
  16. return Complex(x+a.x, y+a.y);
  17. }
  18. Complex operator - (const Complex &a)const{
  19. return Complex(x-a.x, y-a.y);
  20. }
  21. Complex operator * (const Complex &a)const{
  22. return Complex(x*a.x-y*a.y, x*a.y+y*a.x);
  23. }
  24. }A[N],B[N],D[N];
  25. inline int read()
  26. {
  27. int now=0;register char c=gc();
  28. for(;!isdigit(c);c=gc());
  29. for(;isdigit(c);now=now*10+c-'0',c=gc());
  30. return now;
  31. }
  32. void FFT(Complex *a,int lim,int opt)
  33. {
  34. for(int i=0,j=0; i<lim; ++i)
  35. {
  36. if(i>j) std::swap(a[i],a[j]);
  37. for(int l=lim>>1; (j^=l)<l; l>>=1);
  38. }
  39. for(int i=2; i<=lim; i<<=1)
  40. {
  41. int mid=i>>1;
  42. Complex Wn(cos(2.0*PI/i),opt*sin(2.0*PI/i)),t;
  43. for(int j=0; j<lim; j+=i)
  44. {
  45. Complex w(1,0);
  46. for(int k=0; k<mid; ++k,w=w*Wn)
  47. a[j+mid+k]=a[j+k]-(t=w*a[j+mid+k]),
  48. a[j+k]=a[j+k]+t;
  49. }
  50. }
  51. }
  52. int main()
  53. {
  54. n=read()-1;
  55. for(int i=0; i<=n; ++i) A[i].x=read(),B[n-i].x=read();
  56. int lim=1;
  57. while(lim <= n<<1) lim<<=1;
  58. FFT(A,lim,1), FFT(B,lim,1);
  59. for(int i=0; i<lim; ++i) A[i]=A[i]*B[i];
  60. FFT(A,lim,-1);
  61. for(int i=0; i<=n; ++i) printf("%d\n",(int)(A[i+n].x/lim+0.5));
  62. return 0;
  63. }

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

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

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

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

  6. 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} ...

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

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

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

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

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

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

随机推荐

  1. [转]google gflags 库完全使用

    简单介绍 gflags 是 google 开源的用于处理命令行参数的项目. 安装编译 项目主页:gflags ➜ ~ git clone https://github.com/gflags/gflag ...

  2. win10系统下我的电脑右键没有属性

    1.右键点击系统左下角的开始,菜单中点击运行 2.在输入框中输入regeidt,点击确定打开系统的注册表编辑器 3.然后依次打开HKEY_CURRENT_USER\Software\Microsoft ...

  3. ubuntu 18.04 安装 flash

    下载源码包, 解压 sudo cp Downloads/flash_player_npapi_linux.x86_64/libflashplayer.so /usr/lib/mozilla/plugi ...

  4. 栈应用之 括号匹配问题(Python 版)

    栈应用之 括号匹配问题(Python 版) 检查括号是否闭合 循序扫描被检查正文(一个字符)里的一个个字符 检查中跳过无关字符(所有非括号字符都与当前处理无关) 遇到开括号将其压入栈 遇到闭括号时弹出 ...

  5. sqlserver中一些常用的函数总结

    去掉空格方面 LTRIM('内容'):去掉字符串左边的空格 RTRIM('内容'):去掉右边的空格 LTRIM(RTRIM('内容')):去掉字符串左边和右边的空格 REPLACE(‘内容’,' ', ...

  6. Robot Framework测试框架用例脚本设计方法

    Robot Framework介绍 Robot Framework是一个通用的关键字驱动自动化测试框架.测试用例以HTML,纯文本或TSV(制表符分隔的一系列值)文件存储.通过测试库中实现的关键字驱动 ...

  7. SQL中rownum和order by的执行顺序的问题

    在一个SQL中,如果同时使用rownum和order by,会有一个先后顺序的问题. 比如select id1,id2 from t_tablename where rownum<3 order ...

  8. Oracle学习笔记:实现select top N的方法

    由于Oracle不支持select top N语句,所以在Oracle中需要利用order by和rownum的组合来实现select top N的查询. rownum是记录表中数据编号的一个隐藏字段 ...

  9. 面试题:输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数, 使其和等于 m

    问题: 2010年中兴面试题 编程求解: 输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来. 思路: 类似这种组合问题一般都是使 ...

  10. InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法

    简述 InstallShield已经内建了对MySQL和Oracle的支持.但是这个功能是通过ODBC实现的,它对SQL脚本的格式要求非常严格,因此已经通过官方客户端测试的脚本在IS中执行时往往就会报 ...