【题目】B. GCD of Polynomials

【题意】给定n,要求两个最高次项不超过n的多项式(第一个>第二个),使得到它们GCD的辗转次数为n。n<=150。

【算法】构造

【题解】辗转n次是最坏情况——每次辗转至少会使被模数的最高次项变到模数的最高次项-1,也就是必须构造两个多项式满足这种最坏情况。

eg.n=5,(5,4),(4,3),(3,2),(2,1),(1,0),(0,0)。

为了构造最坏情况,考虑模仿斐波那契数列进行构造:

p(0)=1,p(1)=x,p(n)=x*p(n-1)±p(n-2)。

这个数列的特点是,p(n)%p(n-1)=p(n-2),那么只要使用这个数列的pn和pn-1就能达到最坏情况。

其中±的意思是使系数满足要求,观察可知等价于%2。

#include<cstdio>
#define rep(i,j,k) for(int i=j;i<=k;i++)
int f[][],x=,n;
int main(){
scanf("%d",&n);
f[][]=f[][]=;
rep(i,,n){
x=-x;
rep(j,,i)f[x][j]=(f[x][j]+f[-x][j-])%;
}
printf("%d\n",n);
rep(i,,n)printf("%d ",f[x][i]);puts("");
printf("%d\n",n-);
rep(i,,n-)printf("%d ",f[-x][i]);
return ;
}
05-14 08:24