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

Solution

看上去是个FFT的模板题,实际上它就是的
将b数组翻转之后,c数组就可以用FFT求了
手写c数组原来一些位置的式子,然后会发现它们在新的c数组的位置的规律
输出就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const db Pi=acos(-1);
const int MAXN=1<<19;
int n,m,cnt,rev[MAXN],sn;
struct Complex{db real,imag;inline Complex operator + (const Complex &A) const {return (Complex){real+A.real,imag+A.imag};};inline Complex operator - (const Complex &A) const {return (Complex){real-A.real,imag-A.imag};};inline Complex operator * (const Complex &A) const {return (Complex){real*A.real-imag*A.imag,imag*A.real+real*A.imag};};
};
Complex a[MAXN],b[MAXN];
template<typename T> inline void read(T &x)
{T data=0,w=1;char ch=0;while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();if(ch=='-')w=-1,ch=getchar();while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void FFT(Complex *A,int tp)
{for(register int i=0;i<n;++i)if(i<rev[i])std::swap(A[i],A[rev[i]]);for(register int l=2;l<=n;l<<=1){Complex wn=(Complex){cos(2*Pi/l),sin(tp*2*Pi/l)};for(register int i=0;i<n;i+=l){Complex w=(Complex){1,0};for(register int j=0;j<(l>>1);++j){Complex A1=A[i+j],A2=A[i+j+(l>>1)]*w;A[i+j]=A1+A2,A[i+j+(l>>1)]=A1-A2;w=w*wn;}}}
}
int main()
{read(n);m=n+n-1;sn=n;for(register int i=0;i<n;++i)scanf("%lf%lf",&a[i].real,&b[i].real);std::reverse(b,b+n);for(n=1;n<m;n<<=1)++cnt;for(register int i=0;i<n;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(cnt-1));FFT(a,1);FFT(b,1);for(register int i=0;i<n;++i)a[i]=a[i]*b[i];FFT(a,-1);for(register int i=sn-1;i<=sn+sn-2;++i)write((int)(a[i].real/n+0.5),'\n');return 0;
}

转载于:https://www.cnblogs.com/hongyj/p/9561481.html

【刷题】BZOJ 2194 快速傅立叶之二相关推荐

  1. bzoj 2194 快速傅立叶之二

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2194 因为卷积的第 k 项是 sigma(i=0~k)a[ i ]*b[ k-i ] ,也就 ...

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

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

  3. bzoj2194 快速傅立叶之二

    2194: 快速傅立叶之二 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 1730  Solved: 1026 [Submit][Status][D ...

  4. 解题报告(二)C、(darkBZOJ 2194) 快速傅立叶之二(FFT、卷积的概念、常用变换)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  5. prokiller 刷题工具,快速简单自定义题库

    problem-killer (简单易用的刷题工具) 基于vue+element实现,所有数据存在浏览器端. 不需要数据库,不需要服务器. 在线体验 开源地址:github.com/serfend/p ...

  6. BZOJ_2194_快速傅立叶之二_(FFT+卷积)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2194 给出序列\(a[0],a[1],...,a[n-1]\)和\(b[0],b[1],... ...

  7. BZOJ-2194 快速傅立叶之二

    FFT模版题. 观察题目,我们可以发现,只要把序列b倒过来,再联想一下乘法运算... 我们会发现,将序列a和序列b当作100进制数,做一次乘法,然后从低到高每一位便是答案了(乘完无需进位) #incl ...

  8. 【刷题-剑指 Offer】 54. 二叉搜索树的第k大节点

    题目 给定一棵二叉搜索树,请找出其中第k大的节点. 我的解法:(中序遍历) /*** Definition for a binary tree node.* public class TreeNode ...

  9. NOIP刷题记录(打鼹鼠)——二维树状数组板子题

    一.题目描述 在这个"打鼹鼠"的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大--).洞口都在一个大小为n的正方形中.这个正方形在一个平面直角坐标系中,左下角为 ...

最新文章

  1. VTK:Math之1DTupleInterpolation
  2. 通过Chrome模拟和调试网速慢的情况来限制一些P2P视频网站上传速度占满的情况...
  3. 开源开放 | 图数据交互可视化分析框架 InteractiveGraph v0.3 版本发布
  4. UPS不间断电源的种类有哪些 常见的3类UPS电源
  5. 源商城系统V1.0仿卡盟
  6. 2019 第八/九周/十周 开发笔记
  7. QWT错误static struct QMetaObject const QwtPlot
  8. Python中的异常处理try、exception、raise
  9. XILINX-DDR3IP核的使用
  10. linux环境ubuntu: pushd: not found
  11. 计算机考试长文档编辑,职称计算机考试:Powerpoint2003长文档1
  12. 基于51单片机的金沙滩12864的计算器
  13. SOLIDWORKS教程:solidworks常用技巧大全
  14. [渝粤教育] 西南科技大学 管理学原理 在线考试复习资料(2)
  15. ubuntu服务器lxde桌面,LXDE桌面环境简介
  16. 安装splash与启动
  17. python练习-句子逆序2
  18. 测试中使用SecureCRT的经验归纳
  19. java中转义字符的学习---(多看几遍就会了系列)
  20. avrisp mkii问题

热门文章

  1. c语言程序中必不可少的,C语言程序设计(第3章程序控制语句)2
  2. 每个java小应用程序都得继承,JAVA复习题3
  3. stm32 I2C架构
  4. jmeter进程和线程的区别_一文搞懂进程和线程的区别
  5. 怎么解决缺少java.doc_java 生成doc帮助文档时出现的问题
  6. python字符串用法_笔记:python字符串的使用
  7. 华硕和梅林系统哪个好_RUSHCRM:定制CRM软件系统哪个好?
  8. coordinatorlayout_一篇文章学会Coordinatorlayout+AppbarLayout
  9. java义一个方法,返回一组双色球票数
  10. android 保存联系人,保存android联系后获取联系人ID