CF901B GCD of Polynomials 多项式 数论
CF901B GCD of Polynomials 多项式 数论
题意
定义多项式的度\(deg\) 为多项式的最高次数。对于多项式\(A(x) = \sum_{k=0}^na_kx^k\) 以及\(B(x) = \sum_{k=0}^mb_kb^k\)
有唯一的除法表示
\[A(x) = B(x)\cdot D(x) + R(x) , degR(x) \lt degB(x)
\]
\(R(x)\) 也可以定义为\(A mod B\)
现给定\(n\) 要求构造多项式\(A(x)\) 和\(B(x)\) 使得恰好进行n次辗转相除,其中初始的度数不得超过\(n\) ,系数为\(-1\) ,\(0\),\(1\)
题解
显然要进行\(n\)次辗转相除,A的度数一定要是\(n\),B的度数一定是\(n - 1\) ,这样相当于考虑如何使其每次恰好度数减一。
类比斐波那契数列 \(F(n) = F(n - 1) + F(n - 2)\) ,其模\(F(n-1)\) 得到的二元组恰好是 \((F(n - 1),F(n - 2))\) 相当于度数减一。
再到此题,我们需要的多项式也直须满足\(P(n) = x \cdot P(n - 1) \pm P(n - 2)\)
考虑递推关系,令\(P[i][j]\) 表示最高项为\(i\) 第\(j\)项的系数大小有:
\[P[i][j] = P[i - 2][j] + P[i - 1][j - 1] \quad (1 \leq j)
\\边界 P[i][j] = P[i - 2][j] \quad (j =0)
\]
int p[155][155];
int main() {
int n = readint();
p[0][0] = 1;
p[1][1] = 1;
for(int i = 2;i <= n;i++)
for (int j = 0; j <= i; j++) {
if (!j) p[i][j] = p[i - 2][j];
else p[i][j] = (p[i - 2][j] + p[i - 1][j - 1]) % 2;
}
printf("%d\n", n);
for (int i = 0; i <= n; i++) printf("%d ", p[n][i]);
printf("%d\n", n - 1);
for (int i = 0; i < n; i++) printf("%d ", p[n - 1][i]);
}