題目大意:給出一個n 次多項式anxn+an−1xn−1+...+a0 (an≠0) ,判斷這個多項式的函數圖像是否軸對稱/中心對稱
n≤105
定理:n 次多項式(n≥2) 如果軸對稱/中心對稱,其對稱軸/對稱中心的橫座標必爲−an−1n∗an
證明:設對稱軸/對稱中心橫座標爲r ,則f(2r−x) 的n−1 次項係數爲n∗2r∗(−1)n−1+an−1∗(−1)n−1
若n 爲偶數則:
f(x)=f(2r−x)
=> an∗n∗2r∗(−1)+an−1∗(−1)=an−1
若n 爲奇數則:
f(x)+f(2r−x)=2f(r)
=> an∗n∗2r+an−1+an−1=0
解得
r=−an−1n∗an
已知常數r ,現在我們要判斷:
f(x) 是否等於f(2r−x) (n 爲偶數)
f(x) 是否等於2f(r)−f(2r−x) (n 爲奇數)
以下做法以n 爲偶數爲例,n 爲奇數做法類似,不贅述了
做法0:FFT多點求值
取兩兩不同的⌊(n+1)/2⌋ 個點x1,x2,...,xk (xi<r) ,分別判斷是否滿足f(x)=f(2r−x) ,若均滿足則f(n) 對稱,否則不對稱。
證明:
必要性顯然
充分性:
設g(x)=f(2r−x) ,則f(xi)=f(2r−xi)=g(xi)
即
f(x1)=g(x1),f(x2)=g(x2),...,f(xk)=g(xk)
f(2r−x1)=g(2r−x1),f(2r−x2)=g(2r−x2),...,f(2r−xk)=g(2r−xk)
f(r)=g(r)
由n+1 個點確定一個n 次多項式可知,
f(x)=g(x)
即
f(x)=f(2r−x)
證畢。
利用FFT多點求值求出這2k 個點的點值,分別判斷,時間複雜度O(nlog2n)
做法1:FFT直接展開f(2r−x)
二項式定理展開,f(2r−x) 的m 次項係數爲:
∑ni=mCmi(2r)i−m(−1)m
=(−1)mm!∑ni=m(i!)∗((2r)i−m(i−m)!)
容易發現這是一個卷積的形式,於是用FFT直接求出,時間複雜度O(nlogn)
由於上面兩個做法對小朋友很不友好,所以下面我們來介紹一種理論正確率100%的不確定性算法。。。(什麼鬼)
做法2:Schwartz–Zippel引理
我們選取一個隨機的x ,判斷f(x) 是否等於f(2r−x) ,若等於則對稱,否則不對稱
顯然如果不等於那麼鐵定不對稱,但是如果等於,錯誤率是多少?
Schwartz–Zippel引理:設f(x1,x2,...,xn) 爲數域F 上的n 元d 次非零多項式,則隨機取一組x1,x2,...,xn ,則f(x1,x2,...,xn)=0 的概率≤d|F|
對於實數域上的多項式f 來說,|F|=∞ ,d|F|=0
所以正確率是100%【捂臉】
如果覺得不靠譜就多隨機幾個值好了
時間複雜度O(n)
所以這題出不出來,大家看個樂呵吧【捂臉】