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);
    for (int i = 0; i <= n; i++) printf("%d ", p[n][i]);
    printf("%d
", n - 1);
    for (int i = 0; i < n; i++) printf("%d ", p[n - 1][i]);
}
原文地址:https://www.cnblogs.com/hznumqf/p/13535749.html