fft

P3803 【模板】多项式乘法(FFT)

这一生的挚爱 提交于 2020-04-03 07:11:25
题目背景 这是一道FFT模板题 注意:虽然本题开到3s,但是建议程序在1s内可以跑完,本题需要一定程度的常数优化。 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x)。 请求出F(x)和G(x)的卷积。 输入输出格式 输入格式: 第一行2个正整数n,m。 接下来一行n+1个数字,从低到高表示F(x)的系数。 接下来一行m+1个数字,从低到高表示G(x))的系数。 输出格式: 一行n+m+1个数字,从低到高表示F(x)∗G(x)的系数。 输入输出样例 输入样例#1: 复制 1 2 1 2 1 2 1 输出样例#1: 复制 1 4 5 2 说明 保证输入中的系数大于等于 0 且小于等于9。 对于100%的数据: n, m \leq {10}^6 n , m ≤ 1 0 6 , 共计20个数据点,2s。 数据有一定梯度。 空间限制:256MB //problem: P3803 【模板】多项式乘法(FFT) #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int N=1e7+5; const double Pi=acos(-1); int n,m; int rev[N]; int bit,len

R|Shiny练习

三世轮回 提交于 2020-03-28 19:35:19
参考: https://docs.rstudio.com/shinyapps.io/ 1. 日期计算 仿照: http://bjtime.cn/riqi/ 链接: https://dingdangsunny.shinyapps.io/DateCalculate/ 练习Shiny基本输入输出。 library(shiny) ui <- fluidPage( titlePanel("使用Shiny进行日期计算"), h4(textOutput("currentTime")), helpText("请输入起止日期,计算日期间隔。"), helpText("默认计算当前日期与今年1月1日的间隔。"), dateRangeInput(inputId = "daterange", label = "日期范围:", start = as.Date(paste(format(Sys.time()+8*60*60, "%Y"), "/01/01",sep = ""), "%Y/%m/%d"), end = as.Date(format(Sys.time()+8*60*60, "%Y/%m/%d"), "%Y/%m/%d")), textOutput("datedif"), tags$hr(), helpText("请输入起始日期和日期间隔,推算目标日期。"), helpText("

分治FFT

谁说我不能喝 提交于 2020-03-20 21:24:55
目录 分治FFT 目的 算法 代码 分治FFT 目的 解决这样一类式子: \[f[n] = \sum_{i = 0}^{n - 1}f[i]g[n - i]\] 算法 看上去跟普通卷积式子挺像的,但是由于计算 \(f\) 的每一项时都在利用它前面的项来产生贡献,所以不能一次FFT搞完。用FFT爆算复杂度 \(O(n^2logn)\) ,比直接枚举复杂度还高…… 考虑优化这个算法,如果我们要计算区间 \([l, r]\) 内的 \(f\) 值,如果可以快速算出区间 \([l, mid]\) 内的 \(f\) 值对区间 \([mid + 1, r]\) 内的 \(f\) 值产生了怎样的影响,就可以采取CDQ分治,不断递归下去算。 考虑 \(x \in [mid + 1, r]\) , \([l, mid]\) 给它的贡献是: \[h[x] = \sum_{i = l}^{mid}f[i]g[x - i]\] 为了方便,我们将范围扩充到 \([1, x - 1]\) (假设此时 \(f[mid + 1] ... f[r] = 0\) ),因此有: \[h[x] = \sum_{i = l}^{x - 1}f[i]g[x - i]\] 为了便于FFT计算,将枚举改成从0开始。(把表达式中的 \(i\) 改成 \(i + l\) ,因为原来的 \(i\) 等于现在的 \(i + l\) )

[洛谷P4721]【模板】分治 FFT

我与影子孤独终老i 提交于 2020-03-17 01:02:21
题目大意: 给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求: $$ f_i=\sum_{j=1}^if_{i-j}g_j\\ f_0=1 $$ 题解: 直接求复杂度是$O(n^2)$,明显不可以通过此题 分治$FFT$,可以用$CDQ$分治,先求出$f_{[l,mid)}$,可以发现这部分对区间的$f_{[mid,r)}$的贡献是$f_{[l,mid)}*g_{[0,r-l)}$,卷出来加到对应位置就行了,复杂度$O(n\log_2^2n)​$ 卡点: 无 C++ Code: #include <algorithm> #include <cstdio> #include <cctype> namespace std { struct istream { #define M (1 << 21 | 3) char buf[M], *ch = buf - 1; inline istream() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif fread(buf, 1, M, stdin); } inline istream& operator >> (int &x) { while (isspace(*++ch)); for (x = *ch & 15; isdigit(*+

[P4721] 分治 FFT

断了今生、忘了曾经 提交于 2020-03-07 06:51:48
「题意」给定 \(g[0]=1\) , \(g[1~n-1]\) 求序列 \(f[i]=\sum_{j=1}^i f[i-j]*g[j]\ , i\in[1,n-1],f[0]=1\) 。 「分析」分治处理区间[l,r],先递归求出[l,mid],在统计[l,mid]对[mid+1,r]的贡献,可以发现 \[f[x]+=\sum_{i=l}^{mid}f[i]*g[x-i]\ , x\in[mid+1,r]\] 拿卷积算,令 \(A[0,mid-l]\) = \(f[l,mid]\) , \(B[l,r-l]\) = \(g[1,r-l]\) , \(B[0]=0\) ,设 \(C[i]\) = \(A[i]*B[i-j]\) , 那么 \[f[x]+=\sum f[i]*g[x-1]=\sum A[i-l]*B[x-i]=C[x-l]\] 套上ntt 「代码」 #include <bits/stdc++.h> using namespace std; const int N=4e5+10; const int P=998244353,G=3; int n,lmt,l,rev[N]; int g[N],f[N],A[N],B[N]; int qpow(int x,int y) { int c=1; for(; y; y>>=1,x=1LL*x*x%P) if(y&1) c=1LL

Fourier Transform in Python giving blank images

一笑奈何 提交于 2020-03-03 11:42:04
问题 I am new to python and I am simply trying the 2d Fourier transform on an image and simply reconstruct it using ifft2 in numpy. However, the spectrum magnitude and the reconstructed are white images. This might indicate some scaling issue but I don't understand how to resolve it. import matplotlib.image as mpimg import matplotlib.pyplot as plt imgloc="C:\\Users\\AnacondaCodes\\cameraman.png" img=mpimg.imread(imgloc,0) import numpy as np f=np.fft.fft2(img) fshift=np.fft.fftshift(f) magnitude

FFT题集

无人久伴 提交于 2020-03-03 09:46:42
FFT学习参考这两篇博客,很详细,结合这看,互补。 博客一 博客二 很大一部分题目需要构造多项式相乘来进行计数问题。 1. HDU 1402 A * B Problem Plus 把A和B分别当作多项式的系数。 #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> using namespace std; const double PI = acos(-1.0); const int maxn = 5e4+50; struct Complex { double real,image; ///实部和虚部 Complex(double _real,double _image) { real = _real; image = _image; } Complex(){} }; Complex operator + (const Complex &c1,const Complex &c2) { return Complex(c1.real+c2.real,c1.image+c2.image); } Complex operator - (const Complex &c1,const Complex &c2) { return Complex(c1.real-c2.real,c1.image-c2

How to get Information about sharpness of Image with Fourier Transformation?

徘徊边缘 提交于 2020-03-03 08:39:34
问题 i am rookie with Matplotlib, Python, FFT. My Task is to get information about sharpness of a Image with FFT, but how do i get this done? What i have done so far: #getImage: imgArray2 = Camera.GetImage() imgArray2 = cv2.flip(imgArray2, 0) grayImage = Image.fromarray(imgArray2).convert('L') #Fast Fourier Transformation: f = np.fft.fft2(grayImage) #Shift zero frequency to Center fshift = np.fft.fftshift(f) #Shows Result of FFT: #plt.imshow(np.abs(np.log10(fshift)), cmap='gray') #Try to Plot the

Plot FFT as a set of sine waves in python?

笑着哭i 提交于 2020-03-02 19:13:25
问题 I saw someone do this in a presentation but I'm having a hard time reproducing what he was able to do. Here's a slide from his presentation: Pretty cool. He decomposed a dataset using FFT, then plotted the appropriate sine waves that the FFT specified. So in an effort to recreate what he did, I created a series of points that correspond to the combination of 2 sine waves: import matplotlib.pyplot as plt import numpy as np %matplotlib inline x = np.arange(0, 10, 0.01) x2 = np.arange(0, 20, 0

从分治的角度理解FFT

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-02 13:07:03
  本随笔的目标主要在于解决两个多项式相乘得到新多项式的问题,我们举一个例子,A(x)是n-1次的,B(x)是n-1次,那么我们用C(x) = A(x) * B(x),如果要完整的求出C(x)的系数,采取暴力手段的话一般需要N^2的量级,希望在讲完这一章的内容之后,我们都可以知道怎么样在nlogn的复杂度内解决这个问题。   我们把整个算法分成若干步,来计算C(x) = c0 + c1*x + c2*x^2 + ... + c(2n-1)*x^(2n-1)的系数c0~c(2n-1),其中C(x)是由A(x)和B(x)相乘得到的。   我们先介绍一下单位根的内容,学过复数的同学们应该都知道,形如a + bi的复数可以用三角式表达r(cosx + isinx),如果r = 1,我们就得到了一个单位复数cosx + isinx,为了记号的方便,我们把这个复数记作e(x),其中x是[0,2pi)中的实数。于是e(0) = 1,e(x)^2 = e(2x),e(x) * e(y) = e(x + y)都容易得到;如果x = k*pi/2n,我们立刻得到e(x)^0 + e(x)^1 + ... + e(x)^(2n-1) = 2n 或者0,其中2n在k = 0的时候取到,0在其他情况下取到。大概就只需要这些知识。   第一步,我们来介绍对一个多项式A(x),快速求出其在x = e(k *