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]);
}