本題簡單剖析出來就是固定其中乙個串然後另乙個串旋轉到乙個位置值得答案值最大.我們發現每次求值的複雜度是o(n),一共有n種旋轉方法,所以總複雜度是o(n^2),如果把這n種都綜合起來的話不就是近似多項式乘法了嗎?那麼怎麼轉換呢?看下面的圖
以n=5為例,那麼5種旋轉方式的值分部在多項式的**呢?從圖看出就是x^4,x^3和x^8,x^2和x^7,x^1和x^6,1和x^5.總結就是除了第n-1項為乙個組合外,其他的組合是n-i和2*n-i.那不是就fft了嗎,然後找出最大值旋轉位置最後暴力求出準確值,因為fft求出來是有誤差的.
#includeusing namespace std;
typedef long long ll;
typedef complexcomp;
const int mx = 3e5 + 10;
const double pai = acos(-1);
comp a[mx],b[mx];
int rev[mx],n,c[mx],d[mx];
void get_rev(int len)
void fft(comp *p,int len,int v)
r--,l--;
} for(int i=0;i
printf("%lld\n",ret);
return 0;
}
FFT與多項式乘法
鑑於網上關於fft作用的文章並不少,這裡盡量少說廢話,直接說如何理解和具體實現 關於多項式乘法,通常是用係數乘積的方式,這樣的時間複雜度是o n 2 n為多項式項數。這可以滿足大多數的乘法需求,然而當位數大於1000時,此法用起來就顯得捉襟見肘 於是我們便有了偉大的fft來解決這個問題 係數表示法 ...
FFT與多項式乘法
係數表示法 即平時看到的多項式 i 0 n 1 a i x i 點值表示法 乙個最高次為n 1次的多項式f x 可以表示為n個其影象上點 x,y 例如2x 2 3x 1可以表示為 0,1 1,6 2,15 兩種方法可以互相轉換,而點值表示法下兩多項式相乘是非常方便的,只要將同乙個x對應的兩式y值相乘...
多項式之加減乘
多項式計算也就是在動用鍊錶 鍊錶中存下多項式的係數和指數 使鍊錶之間進行運算 加法 a b的運算就等同於單鏈表的插入 使指數相同的係數相加減 減法 就是使相加法的後一項取餘然後再做加法 乘法 使其a中煉表節點與之b中煉表所以節點依次相乘 然後按順序插入進新建的鍊錶中。include include ...