BZOJ2194: 快速傅立叶之二 FFT_卷积
Description
请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。
Input
Output
输出N行,每行一个整数,第i行输出C[i-1]。
题解:
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- #include <cstring>
- #define setIO(s) freopen(s".in","r",stdin)
- #define maxn 200000
- #define pi 3.1415926535898
- using namespace std;
- int len=1,l,r[maxn<<1];
- int ans[maxn];
- char str1[maxn],str2[maxn];
- struct Cpx{
- double x,y;
- Cpx(double t1=0,double t2=0){x=t1,y=t2;}
- }A[maxn<<1],B[maxn<<1],C[maxn<<1],BB[maxn<<1];
- Cpx operator+(Cpx a,Cpx b){ return Cpx(a.x+b.x,a.y+b.y);}
- Cpx operator-(Cpx a,Cpx b){ return Cpx(a.x-b.x,a.y-b.y);}
- Cpx operator*(Cpx a,Cpx b){ return Cpx(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
- void FFT(Cpx *a,int n,int flag){
- for(int i=0;i<n;++i) if(i<r[i]) swap(a[i],a[r[i]]);
- for(int mid=1;mid<n;mid<<=1){
- Cpx wn(cos(pi/mid),flag*sin(pi/mid)),x,y;
- for(int j=0;j<n;j+=(mid<<1)){
- Cpx w(1,0);
- for(int k=0;k<mid;++k){
- x=a[j+k],y=w*a[j+mid+k];
- a[j+k]=x+y,a[j+mid+k]=x-y;
- w=w*wn;
- }
- }
- }
- }
- int main(){
- //setIO("input");
- int n;
- scanf("%d",&n);
- for(int i=0;i<n;++i) scanf("%lf",&A[i].x),scanf("%lf",&BB[i].x);
- for(int i=0;i<n;++i) B[i].x=BB[n-i-1].x;
- while(len<n+n) len<<=1,++l;
- for(int i=0;i<len;++i)
- r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
- FFT(A,len,1),FFT(B,len,1);
- for(int i=0;i<=len;++i) C[i]=A[i]*B[i];
- FFT(C,len,-1);
- for(int i=0;i<=len;++i) ans[i]=(int)(C[i].x/len+0.5);
- for(int i=0;i<n;++i) printf("%d\n",ans[i+n-1]);
- return 0;
- }
BZOJ2194: 快速傅立叶之二 FFT_卷积的更多相关文章
- BZOJ2194: 快速傅立叶之二(NTT,卷积)
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1776 Solved: 1055[Submit][Status][Discuss] Descript ...
- bzoj2194 快速傅立叶之二 ntt
bzoj2194 快速傅立叶之二 链接 bzoj 思路 对我这种和式不强的人,直接转二维看. 发现对\(C_k\)贡献的数对(i,j),都是右斜对角线. 既然贡献是对角线,我们可以利用对角线的性质了. ...
- [bzoj2194]快速傅立叶之二_FFT
快速傅立叶之二 bzoj-2194 题目大意:给定两个长度为$n$的序列$a$和$b$.求$c$序列,其中:$c_i=\sum\limits_{j=i}^{n-1} a_j\times b_{j-i} ...
- bzoj2194: 快速傅立叶之二
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- bzoj千题计划256:bzoj2194: 快速傅立叶之二
http://www.lydsy.com/JudgeOnline/problem.php?id=2194 相乘两项的下标 的 差相同 那么把某一个反过来就是卷积形式 fft优化 #include< ...
- BZOJ.2194.快速傅立叶之二(FFT 卷积)
题目链接 \(Descripiton\) 给定\(A[\ ],B[\ ]\),求\[C[k]=\sum_{i=k}^{n-1}A[i]*B[i-k]\ (0\leq k<n)\] \(Solut ...
- BZOJ2194:快速傅立叶之二(FFT)
Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...
- BZOJ2194 快速傅立叶之二 【fft】
题目 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非负整数. 输入格式 ...
- 2018.11.18 bzoj2194: 快速傅立叶之二(fft)
传送门 模板题. 将bbb序列反过来然后上fftfftfft搞定. 代码: #include<bits/stdc++.h> #define ri register int using na ...
随机推荐
- vc++如何创建程序--利用快捷键进行多行注释
Eclipse同时注释多行①:ctrl+/或 ②:ctrl+shift+/ : Visual studio先按ctrl+k 再按 ctrl+c 2.在VC++6.0中需要自己设置快捷键,设置方法链接如 ...
- JavaScript 原型 原型链
一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 var o1 = ...
- Project Euler 32 Pandigital products
题意:找出所有形如 39 × 186 = 7254 这种,由 1 - 9,9个数字构成的等式的和,注意相同的积不计算两次 思路:如下面两种方法 方法一:暴力枚举间断点 /*************** ...
- POJ 1061 青蛙的约会( 拓欧经典题 )
链接:传送门 思路:简单拓展欧几里德,分析后可以得到方程 x + m * t = y + n * t + L * s( s控制圈数,t代表跳t次会碰面 ),经过化简可以得到 ( n - m ) * t ...
- 记Spring搭建功能完整的个人博客「Oyster」全过程[其二] Idea中Maven+SpringBoot多模块项目开发的设计和各种坑(模块间依赖和打包问题)
大家好嘞,今天闲着没事干开写写博客,记录一下Maven+SpringBoot的多模块设计和遇到的坑. 多模块设计 简单说明一下截止目前的需求: 需要RESTful API:对文章.标签.分类和评论等的 ...
- [LUOGU2730] 魔板
搜索水题.因为只有8个数,排列一共有40320种,直接bfs,判重就行了. 但是判重的时候直接用8进制表示的话要88的bool数组.这种操作太low了,于是我们可以用康托展开,降成8!. 康托展开其实 ...
- PHP 闭包之变量作用域
在项目中,难免会遇到闭包的形式,那么在闭包中,变量的作用域到底是怎么样的呢.下面有几个简单的例子. e1 function test_1() { $a = 'php'; $func = funct ...
- Problem 11
Problem 11 # Problem_11.py """ In the 20×20 grid below, four numbers along a diagonal ...
- Python面向对象之静态方法、静态方法与类方法
静态属性: 类调用函数属性时,需要先将类实例化,再将实例作为函数属性传入:类的实例调用函数属性时需要在后面加括号. class Building: def __init__(self, name, o ...
- Android学习总结(3)——Handler深入详解
什么是Handler Handler是Android消息机制的上层接口,它为我们封装了许多底层的细节,让我们能够很方便的使用底层的消息机制.Handler的最常见应用场景之一便是通过Handler在子 ...