题目大意:给出一个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)
所以这题出不出来,大家看个乐呵吧【捂脸】