2194: 快速傅立叶之二

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 1730  Solved: 1026
[Submit][Status][Discuss]

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
分析:很显然,这道题要用FFT来做,但是题目所给的式子并不是一个标准的卷积的形式,需要进行变形.
   一般而言,能用FFT求的式子c[k] = a[i] * b[j], i + j是一个只与k有关的式子,其它的都是常数项.  对于这道题,把bi变成b_n-i-1
那么ck = ai*b_i - k = ai * b_n - (i - k) - 1 = ai * b_n -i - 1 + k.  a和b的下标加起来恰好是n + k,n是常数,满足做fft的要求.
   最后c数组的值要整体向后移k位. 
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int maxn = (1 << 18) + 5;
const double pai = acos(-1.0);
int n,a[maxn],b[maxn],len;struct node
{double real, imag;node(double real = 0.0, double imag = 0.0){this->real = real, this->imag = imag;}node operator - (const node&elem) const{return node(this->real - elem.real, this->imag - elem.imag);}node operator + (const node&elem) const{return node(this->real + elem.real, this->imag + elem.imag);}node operator * (const node&elem) const{return node(this->real * elem.real - this->imag * elem.imag, this->real * elem.imag + this->imag * elem.real);}void set(double real = 0.0, double imag = 0.0){this->real = real, this->imag = imag;}
} A[maxn],B[maxn];void pre()
{for (int i = 0; i < n; i++)scanf("%d%d",&a[i],&b[i]);len = 1;while (len < (n << 1))len <<= 1;for (int i = 0; i < n; i++)A[i].set(a[i],0),B[i].set(b[n - i - 1],0);for (int i = n; i < len; i++)A[i].set(),B[i].set();
}void Swap(node &a,node &b)
{node temp = a;a = b;b = temp;
}void zhuan(node *y)
{for (int i = 1,j = len >> 1,k; i < len - 1; i++){if (i < j)Swap(y[i],y[j]);k = len >> 1;while (j >= k){j -= k;k >>= 1;}if (j < k)j += k;}
}void FFT(node *y,int op)
{zhuan(y);for (int h = 2; h <= len; h <<= 1){node temp(cos(op * pai * 2 / h),sin(op * pai * 2 / h));for (int i = 0; i < len; i += h){node W(1,0);for (int j = i; j < i + h / 2; j++){node u = y[j];node v = W * y[j + h / 2];y[j] = u + v;y[j + h / 2] = u - v;W = W * temp;}}}if (op == -1)for (int i = 0; i < len; i++)y[i].real /= len;
}void solve(node *A,node *B)
{FFT(A,1);FFT(B,1);for (int i = 0; i < len; i++)A[i] = A[i] * B[i];FFT(A,-1);
}int main()
{scanf("%d",&n);pre();solve(A,B);for (int i = n - 1; i < 2 * n - 1; i++)printf("%d\n",(int)(A[i].real + 0.5));return 0;
}

转载于:https://www.cnblogs.com/zbtrs/p/8639793.html

bzoj2194 快速傅立叶之二相关推荐

  1. bzoj2194: 快速傅立叶之二

    了解到了FFT求卷积,但是还是感性的认识.. 取反就可以了.输出一定要加int!!!! #include<cstdio> #include<iostream> #include ...

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

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

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

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

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

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

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

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

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

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

  8. bzoj 2194 快速傅立叶之二

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

  9. c语言二维图像傅立叶变换,C语言数据结构算法之实现快速傅立叶变换.pdf

    C语语言言数数据据结结构构算算法法之之实实现现快快速速傅傅立立叶叶变变换换 C语语言言数数据据结结构构算算法法之之实实现现快快速速傅傅立立叶叶变变换换 本实例将实现二维快速傅立叶变换,同时也将借此实例 ...

最新文章

  1. Chorme Error 312 (net::ERR_UNSAFE_PORT) | Chorme 不信任端口
  2. Android开发笔记(一百三十七)自定义行为Behavior
  3. 转----cer文件和pfx文件的区别
  4. vue导出excel并修改样式
  5. hua图软件 mac_实用电脑绘图软件~推荐_mac_微软怎么样_智能_魅可怎么样_圣诞节去哪玩_ipad_绘图软件_科技数码_应用推荐...
  6. 如何解除计算机上的安全警报,怎么关闭windows的安全警报
  7. Windows下的random_device
  8. android转发短信到邮箱,利用短信通知的方式在Tasker中实现收到Android手机短信自动转发到邮箱...
  9. 操作系统和指弹吉他的联系
  10. 深入理解什么是Beta分布
  11. 【智能电视必装软件】小鲸电视、hdp直播国庆假期经典好剧随心看
  12. 用计算机弹发如雪,计算器弹音乐谱子
  13. imooc《Python入门与实战》学习总结(七)Python中的面向对象
  14. 图解Fiddler如何抓手机APP数据包【超详细】
  15. DevOps Master课程总结:知否知否,应是DevOps肥ITIL瘦(送ITIL4前生今世)
  16. OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(下)
  17. 切片器可以设置日期格式?_Excel切片器,原来有这么多厉害的用法
  18. 关闭交互式服务检测(UI0Detect)
  19. android 自动化 微信,C#手把手教你玩微信自动化
  20. JSON转换为JS对象和JS对象转换为JSON

热门文章

  1. 浅谈贷后管理之贷后跟踪——微金时代解决方案
  2. 简易调用及实例化视图
  3. Linux上DNS实现工具之bind详叙
  4. 世界顶级精英们的人生哲学(转)
  5. Engineering Department Bulletin News and information for the Department
  6. how can you understand the world
  7. linkedin规则
  8. 前端需要了解的 Cookies 和 WebStorage
  9. 2018年东北农业大学春季校赛 F wyh的集合【思维】
  10. 实操《深入浅出React和Redux》第二期—Flux