FFT 入門

推薦博客 : https://oi.men.ci/fft-notes/

卷積的理解 : https://www.zhihu.com/question/22298352?rf=21686447

?

題目鏈接 :http://uoj.ac/problem/34

?

這是一道模板題。

給你兩個多項式,請輸出乘起來后的多項式。
輸入格式

第一行兩個整數 nn 和 mm,分別表示兩個多項式的次數。

第二行 n+1n+1 個整數,表示第一個多項式的 00 到 nn 次項系數。

第三行 m+1m+1 個整數,表示第二個多項式的 00 到 mm 次項系數。
輸出格式

一行 n+m+1n+m+1 個整數,表示乘起來后的多項式的 00 到 n+mn+m 次項系數。
樣例一
input

1 2
1 2
1 2 1

output

1 4 5 2

explanation

(1+2x)?(1+2x+x2)=1+4x+5x2+2x3(1+2x)?(1+2x+x2)=1+4x+5x2+2x3。
限制與約定

0≤n,m≤105,保證輸入中的系數大于等于 0 且小于等于 9。

時間限制:1s1s

空間限制:256MB

?

題意? :  給你兩個多項式的系數,從 0 到 n 給出,求這兩個多項式相乘后的系數,從小到大輸出

思路分析 : 裸的 FFT ,參考kuangbin 的板子

    就是要注意以下數組的大小,main中的 len 是 2^k , 因此當m+n = 2e5 左右時,此時 2^k = 260000+ , 因此要注意數組的大小

代碼示例:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5+63000;
const double pi = acos(-1.0);
int n, m;
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];
int sum[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 >> m;int len = 1;while(len <= (n+m)) len <<= 1;for(int i = 0; i <= n; i++) scanf("%lf", &x1[i].x);fft(x1, len, 1);for(int i = 0; i <= m; i++) scanf("%lf", &x2[i].x);fft(x2, len, 1);for(int i = 0; i < len; i++)x1[i] = x1[i]*x2[i];fft(x1, len, -1);for(int i = 0; i <= n+m; i++){sum[i] = (int)(x1[i].x+0.5); // sum[] 是最后的答案 printf("%d%c", sum[i], i ==n+m?'\n':' ');}return 0;
}

?

____________________________________________________________________________

int rev[maxl];
void get_rev(int bit)//bit表示二進制位數,計算一個數在二進制翻轉之后形成的新數
{for(int i=0;i<(1<<bit);i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
}
void fft(cd *a,int n,int dft)//n表示我的多項式位數
{for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);//中間的那個if保證了每個數做多只被交換了1次//如果不寫那么會有一些數被交換兩次,導致最終的位置沒有變for(int step=1;step<n;step<<=1)//模擬一個合并的過程{cd wn=exp(cd(0,dft*PI/step));//計算當前單位復根for(int j=0;j<n;j+=step<<1){cd wnk(1,0);//計算當前單位復根for(int k=j;k<j+step;k++){//蝴蝶操作cd x=a[k];cd y=wnk*a[k+step];a[k]=x+y;//這就是上文中F(x)=G(x)+ωH(x)的體現a[k+step]=x-y;//后半個“step”中的ω一定和“前半個”中的成相反數//“紅圈”上的點轉一整圈“轉回來”,轉半圈正好轉成相反數//一個數相反數的平方與這個數自身的平方相等..wnk*=wn;}}}if(dft==-1) for(int i=0;i<n;i++) a[i]/=n;//考慮到如果是IDFT操作,整個矩陣中的內容還要乘上1/n  
}

?

轉載于:https://www.cnblogs.com/ccut-ry/p/9498240.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450870.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450870.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450870.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MPEG4視頻壓縮編碼技術詳解

MPEG全稱是Moving Pictures Experts Group&#xff0c;它是“動態圖象專家組”的英文縮寫&#xff0c;該專家組成立于1988年&#xff0c;致力于運動圖像及其伴音的壓縮編碼標準化工作&#xff0c;原先他們打算開發MPEG1、MPEG2、MPEG3和MPEG4四個版本&#xff0c;以適用于不同帶…

oracle orion hugepages_settings.sh(支持OEL 7,4.1內核)

orion需要首先配置hugepage&#xff0c;否則會出現下列錯誤。[rootyyxxdb01 ~]# /opt/app/11.2.0/grid_home/bin/orion -run oltp -testname mytestORION: ORacle IO Numbers -- Version 11.2.0.4.0************************ Large Pages Information *******************Param…

eclipse啟動出現“An Error has Occurred. See the log file”解決方法

見&#xff1a;http://blog.csdn.net/ww130929/article/details/52652222 這段時間開發java的項目&#xff0c;剛開始啟動Eclipse的時候經常遇到這個問題&#xff0c;寫這篇博客來記錄解決方法。 1.刪除工程目錄下的&#xff1a; “.metadata/.plugins/org.eclipse.core.resour…

初識NIO之Java小Demo

Java中的IO、NIO、AIO&#xff1a; BIO&#xff1a;在Java1.4之前&#xff0c;我們建立網絡連接均使用BIO&#xff0c;屬于同步阻塞IO。默認情況下&#xff0c;當有一條請求接入就有一條線程專門接待。所以&#xff0c;在客戶端向服務端請求時&#xff0c;會詢問是否有空閑線程…

RTP協議詳解

RTP協議分析 第1章. RTP概述 1.1. RTP是什么 RTP全名是Real-time Transport Protocol&#xff08;實時傳輸協議&#xff09;。它是IETF提出的一個標準&#xff0c;對應的RFC文檔為RFC3550&#xff08;RFC1889為其過期版本&#xff09;。RFC3550不僅定義了RTP&#xff0…

線程狀態轉換

一、線程狀態轉換 新建&#xff08;New&#xff09; 創建后尚未啟動。 可運行&#xff08;Runnable&#xff09; 可能正在運行&#xff0c;也可能正在等待 CPU 時間片。 包含了操作系統線程狀態中的 Running 和 Ready。 阻塞&#xff08;Blocking&#xff09; 等待獲取一個排它…

Eclipse中啟動tomcat報錯java.lang.OutOfMemoryError: PermGen space的解決方法

見&#xff1a;http://outofmemory.cn/java/OutOfMemoryError/outofmemoryerror-permgen-space-in-tomcat-with-eclipse 有的項目引用了太多的jar包&#xff0c;或者反射生成了太多的類&#xff0c;異或有太多的常量池&#xff0c;就有可能會報java.lang.OutOfMemoryError: Per…

MPEG-4 AVC/H.264 信息

作者&#xff1a;haibara 來源&#xff1a;pcicp.com 本FAQ由&#xff08;haibara&#xff09;翻譯&#xff0c;期間受到kaito_mkid&#xff08;pcicp&#xff09;幫助&#xff0c;在此感謝&#xff0c;由于Newbie的關系&#xff0c;如有翻譯錯誤&#xff0c;還請各位指出&…

eclipse搜索關鍵字

見&#xff1a;https://jingyan.baidu.com/article/e6c8503c1a60d2e54f1a18e3.html

裝飾器語法糖運用

裝飾器語法糖運用 前言&#xff1a;函數名是一個特性的變量&#xff0c;可以作為容器的元素&#xff0c;也可以作為函數的參數&#xff0c;也可以當做返回值。閉包定義&#xff1a; 內層函數對外層函數&#xff08;非全局&#xff09;變量的引用&#xff0c;這個內層函數就可以…

fb 4.7英文版 顯示行數

窗口&#xff08;window&#xff09;首選項&#xff08;Preference&#xff09;—>常規&#xff08;General&#xff09;—>編輯器&#xff08;Editors&#xff09;—>文本編輯器&#xff08;Text Editors&#xff09;—>“顯示行號”&#xff08;Show line number…

集市中迷失的一代:FreeBSD核心開發者反思開源軟件質量

摘要&#xff1a;本文作者Poul-Henning Kamp (phkFreeBSD.org) &#xff0c;26年的計算機程序員&#xff0c;他編寫的軟件以底層構建塊的形式廣泛被開源和商業產品采用。講述作者在看完《設計原本》這本書后所引發的共鳴&#xff01; 13年前&#xff0c;新興的草根開源軟件運動…

點擊表格彈窗獲取另外一套數據之后,原表格相關數據的調用

用H5新屬性&#xff0c;data-*&#xff0c; $獲取方式&#xff1a; 待續。。。。。。。 轉載于:https://www.cnblogs.com/He-tao-yuan/p/9888316.html

谷歌瀏覽器如何如何禁用彈出窗口阻止程序

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在工具欄上使用 Google Chrome 菜單。工具欄上的菜單位于瀏覽器右上角。 選擇“設置”。 在頁面底端找到并點擊“顯示高級設置”。 在“隱…

Python 3 入門,看這篇就夠了

文章目錄 簡介基礎語法運算符變量數據類型流程控制迭代器生成器函數 自定義函數參數傳遞 可更改與不可更改對象參數匿名函數變量作用域模塊面向對象錯誤和異常文件操作序列化命名規范參考資料簡介 Python 是一種高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。Pyt…

面試經歷(二)

前面說到用數據庫中的鎖機制對并發事務進行控制&#xff0c;這節來說說事務方法和事務方法發生嵌套調用時事務如何進行傳播。例如&#xff1a;方法可能繼續在現有事務中運行&#xff0c;也可能開啟一個新事務&#xff0c;并在自己的事務中運行。例如&#xff1a;方法可能繼續在…

最有價值的編程忠告

摘要&#xff1a;本文是來自貝爾實驗室Plan 9操作系統的創始人Rob Pike給大家分享的編程忠告&#xff01;Rob Pike&#xff0c;目前谷歌公司最著名的軟件工程師之一&#xff0c;曾是貝爾實驗室Unix開發團隊成員&#xff0c;締造Go語言和Limbo語言的核心人物。 Rob Pike&#xf…

Column count doesn't match value count at row 1 原因

mysql 提示 &#xff1a; Column count doesnt match value count at row 1錯誤&#xff0c;SQL語句中列的個數和值的個數不等&#xff0c; 如&#xff1a; insert into table1 (field1,field2) values(值1&#xff0c;值2&#xff0c;值3 ) 列只有2個&#xff0c;值 卻有3個…

MarkDowm快捷鍵大全

文章目錄一&#xff1a;菜單欄二&#xff1a;文件三&#xff1a;編輯四&#xff1a;段落五&#xff1a;格式六&#xff1a;視圖一&#xff1a;菜單欄 文件&#xff1a;altF 編輯&#xff1a;altE 段落&#xff1a;altP 格式&#xff1a;altO 視圖&#xff1a;altV 主題&#x…

Kinect2.0-空間長度測量

1. 鼠標左鍵按下選擇起點&#xff0c;拖動鼠標&#xff0c;左鍵放開&#xff0c;確定終點。 實現效果1實現效果22. 在linux下使用libfreenect2開源多平臺驅動來獲取kinect2.0的傳感器信息&#xff0c;得到深度信息&#xff0c;并通過libfreenect2提供的getPointXYZ函數&#xf…