前置知识
代数基本定理
定理:每个次数 ≥ 1 复系数多项式在复数域中至少有一个跟。
由此推出,n次复系数多项式方程在复数域内有且只有n个根(重根按重数计算)。(只要不断把多项式除以(x-xa),即可从有一个根推出有n个根)
实系数多项式因式分解定理
定理:每个次数 ≥ 1 实系数多项式在实数域上都可以唯一的分解成一次因式和二次不可约多项式的乘积。
证:
对 f(x) 的次数用数学归纳法。
n=1时,一次多项式显然不可约,定理成立;
假设对次数 ≤ n 时定理成立,
设 f(x) 是 n 次多项式,由代数基本定理,f(x) 有一复根 α.
如果 α 是实数,那么 $f(x) = (x - alpha )f_1(x)$,其中 $f_1(x)$ 为 n-1 次实系数多项式;
如果 α 不是实数,那么 $ar alpha$ 也是 f(x) 的根,于是
$f(x) = (x - alpha )(x - ar alpha ) f_2(x) \= [x^2 - (alpha + ar alpha) x + a ar alpha]f_2(x)$,其中 $x^2 - (alpha + ar alpha) x + a ar alpha$ 是实系数二次不可约多项式,从而 $f_2(x)$ 是 n-2 次实系数多项式。
题目
给出一个多项式,判断在实数范围内是否可分解。
分析:
由上面定理可知,在实数范围内任一不可约多项式只能是一次或二次的。
除此之外,显然有奇数次实系数多项式至少有一个实根。
(测试中含有常数
#include<bits/stdc++.h> using namespace std; int n, a[25]; int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i = n; i >= 0;i--) scanf("%d", &a[i]); if(n <= 1 || (n == 2 && a[1] * a[1] - 4 * a[2] * a[0] < 0)) printf("Yes "); else printf("No "); } return 0; }