简单的 FFT 变形 - BZOJ 2194
「BZOJ2194」快速傅立叶之二
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]。
Sample Input
3 1
2 4
1 1
2 4
1 4
Sample Output
24
12
10
6
1
思路分析 :
初看题目所要求的式子,很像卷积, f(x) * g(x) = sigma(f(x) g(t-x)) 那么我们只要将 b数组变换一下即可, 另 d[i] = b[n-i-1] , 则a[i]*b[k-i] = a[i]*b[n-1-(n+k-i-1)] = a[i]*d[n+k-1-i] ( k-1 < i < n) 这不就是一个标准的卷积了吗,fft 即可
代码示例 :(未测试)
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- const int maxn = 3e5+5;
- const double pi = acos(-1.0);
- int n;
- struct Complex{
- double x, y;
- Complex (double _x=0, double _y=0):x(_x), y(_y){}
- Complex operator -(const Complex &b)const{
- return Complex(x-b.x, y-b.y);
- }
- Complex operator +(const Complex &b)const{
- return Complex(x+b.x, y+b.y);
- }
- Complex operator *(const Complex &b)const{
- return Complex(x*b.x-y*b.y, x*b.y+y*b.x);
- }
- };
- Complex x1[maxn], x2[maxn];
- void change(Complex y[], int len){
- for(int i = 1, j = len/2; i < len-1; i++){
- if (i < j) swap(y[i], y[j]);
- int k = len/2;
- while(j >= k){
- j -= k;
- k /= 2;
- }
- if (j < k) j += k;
- }
- }
- void fft(Complex y[], int len, int on){
- change(y, len);
- for(int h = 2; h <= len; h <<= 1){
- Complex wn(cos(-on*2*pi/h), sin(-on*2*pi/h));
- for(int j = 0; j < len; j += h){
- Complex w(1, 0);
- for(int k = j; k < j+h/2; k++){
- Complex u = y[k];
- Complex t = w*y[k+h/2];
- y[k] = u+t;
- y[k+h/2] = u-t;
- w = w*wn;
- }
- }
- }
- if (on == -1){
- for(int i = 0; i < len; i++)
- y[i].x /= len;
- }
- }
- int main () {
- cin >> n;
- for(int i = 0; i < n; i++) scanf("%lf%lf", &x1[i].x, &x2[n-i-1].x);
- int len = 1;
- while(len < 2*n) len <<= 1;
- fft(x1, len, 1); fft(x2, len, 1);
- for(int i = 0; i < len; i++) x1[i] = x1[i]*x2[i];
- fft(x1, len, -1);
- for(int i = n-1; i < 2*n-1; i++){
- int x = (int)(x1[i].x+0.5);
- printf("%d\n", x);
- }
- return 0;
- }
简单的 FFT 变形 - BZOJ 2194的更多相关文章
- BZOJ 2194 快速傅立叶变换之二 | FFT
BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...
- 【BZOJ 2194】2194: 快速傅立叶之二(FFT)
2194: 快速傅立叶之二 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1273 Solved: 745 Description 请计算C[k]= ...
- bzoj 2194: 快速傅立叶之二 -- FFT
2194: 快速傅立叶之二 Time Limit: 10 Sec Memory Limit: 259 MB Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k & ...
- bzoj 2194 快速傅立叶之二 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2194 如果把 a 序列翻转,则卷积得到的是 c[n-i],再把得到的 c 序列翻转即可. 代 ...
- BZOJ.2194.快速傅立叶之二(FFT 卷积)
题目链接 \(Descripiton\) 给定\(A[\ ],B[\ ]\),求\[C[k]=\sum_{i=k}^{n-1}A[i]*B[i-k]\ (0\leq k<n)\] \(Solut ...
- BZOJ 2194 快速傅立叶之二 ——FFT
[题目分析] 咦,这不是卷积裸题. 敲敲敲,结果样例也没过. 看看看,卧槽i和k怎么反了. 艹艹艹,把B数组取个反. 靠靠靠,怎么全是零. 算算算,最终的取值范围算错了. 交交交,总算是A掉了. [代 ...
- BZOJ 2194 FFT
思路: 题目中给的是差值一定的 那么就把b数组倒一下 不就变成 i+j=k(k为定值的了嘛) 嗯 然后搞个FFT //By SiriusRen #include <cstdio> #inc ...
- 实现了一个简单的cage变形器
今天实现了一个简单变形器,可以用一个网格的形状影响另一个网格的形状. 如图,蓝色网格的形状被灰色网格操控. 当前的算法非常简单,就是计算蓝色网格每个点到灰色网格每个点的距离,以距离x次方的倒数作为权重 ...
- 利用GDI+处理图像,包括图像的的裁剪显示、转置、镜像、简单旋转、变形等。
一.图像的裁剪显示:有时程序需要显示图像的一部分而不是全部.实例代码如下: CDC* pDC = GetDC(); Graphics graph(pDC->GetSafeHdc()); Imag ...
随机推荐
- java异常处理格式
异常处理的5个关键字 try ,catch, finally throw, throws 我的总结: 捕获异常:先捕获小异常再捕获大异常. 程序是调出来的,不是写出来的:多测试是程序员的必修课. ...
- 【u128】又一个数字游戏
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小明拿出了一个素数集合,{2, 3, 5, 7, 11, 13, -, 127, -},他发现,从小到 ...
- sublime text3神器插件
(首先安装)Package Control Package Control,就像 Linux 下的 apt-get 和 yum 一样,它是 Sublime Text 的包管理器 1.Emmet 是一 ...
- 154th LeetCode Weekly Contest
A B D均比较简单.先说C题 K-Concatenation Maximum Sum Given an integer array arr and an integer k, modify the ...
- ZR1050
ZR1050 http://www.zhengruioi.com/problem/1030 题目大意: 给定一棵带点权的树,求所有联通块的点权和的平方的和 \(n \le 10^5\) 题解 首先,关 ...
- H3C配置Header进入用户视图的提示信息--系统视图
incoming:登录终端用户界面时的提示信息. Header 3种类型 login:登录验证时的提示信息. Vty模式 ...
- Command failed: git -c core.longpaths=true config --get remote.origin.url
「Unable to Connect to GitHub.com For Cloning」 Error: Command failed: git -c core.longpaths=true conf ...
- 【Docker】镜像分层存储与镜像精简
Linux操作系统 Linux操作系统由内核空间和用户空间组成. 内核空间是kernel,用户空间是rootfs, 不同Linux发行版的区别主要是rootfs.比如 Ubuntu 14.04 使用 ...
- IAP升级
一.IAP原理 1.在正常情况下,程序运行路流程: 和STM32类似,STM8内部闪存(FLASH)地址起始于 0x8000(STM32是0x08000000),一般情况下,程序文件就从此地 址开始写 ...
- JMeter数据库测试计划
在系统上安装数据库服务器之后. 按着这些次序: 创建名为testdb的数据库. 创建表 - tb_user. 将记录插入到tb_user表中. 下图显示了创建的数据库及其记录. 注意:您需要将相应的J ...