http://codeforces.com/contest/902/problem/D
对于两个整数a、b,求最大公约数gcd(a,b)的辗转相除法的算法如下
// 辗转相除法 + 递归 int gcd(int num1, int num2) { if(0 == num2) { return num1; } return gcd(num2, num1 % num2); }对于多项式A(x),定义deg A(x)为多项式的次数。对于多项式A、B,定义多项式mod运算:若A(x)=B(x)·D(x)+R(x),deg R(x)
辗转相除将多项式对(A,B)转化成(B,A mod B),最终A mod B为0时,B即为所求。
考虑整数Fibonacci数列:F(0)=1,F(1)=1,F(n+1)=F(n)+F(n-1)。
于是,一次辗转相除法将(F(n+1),F(n))转化成(F(n),F(n-1))。于是,(F(n),F(n-1))在n次辗转相除后结束操作。
类似地,构造多项式的情形: P(0) = 1 P(1) = x P(n + 1) = x·P(n) ± P(n-1)
递推时,维护P(n+1)的系数在{-1,0,1}中取值,这可以通过符号选择(+/-)实现。
若只取“+”号,还可以进一步构造多项式: P(0) = 1 P(1) = x P(n + 1) ≡ [x·P(n) + P(n-1)] mod 2 ① 这里mod 2是为了保证,系数不要超过1。
例1:根据式子①,求P(0)~p(5) P(0) = 1 P(1) = x P(2) = x ^ 2 + 1 P(3) = [x ^ 3 + x + x] mod 2 = x ^ 3 P(4) = x ^ 4 + x ^ 2 + 1 P(5) = [x ^ 5 + x ^ 3 + x + x ^ 3] mod 2 = x ^ 5 + x
例2:根据P(n + 1) = x·P(n) + P(n-1),求P(2) / P(1) P(2) / P(1) = (x ^ 2 + 1) / x = x …… 1 这里的余数1 等于 P(0)
例3:P(n + 1) = x·P(n) + P(n-1),求P(3) / P(2) P(3) / P(2) = x ^ 3 / (x ^ 2 + 1) = x …… -x 这里余数-x不完全等于P(1),差了一个正负号。 这是因为,用P(2)和P(1)计算P(3)的时候,用了mod 2运算,使得x的系数变为0。 否则用没取模之前的P(3) = x ^ 3 + 2x去除P(2),余数正好等于P(1)
更多内容请关注微信公众号
