Loading

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]);
}
posted @ 2020-08-20 16:20  MQFLLY  阅读(277)  评论(0编辑  收藏  举报