1. 将2^n个0和2^n 个1,排成一圈。从任一个位置开始,每次按逆时针的方向以长度为n+1的单位进行数二进制数。
要求给出一种排法,用上面的方法产生出来的2^(n+1)个二进制数都不相同。
例如,当n=2时, 即2^2个0 和2……2个1 排成如下一圈:
比如,从A位置开始,逆时针方向取三个数000,然后再从B位置上开始取三个数001,接着从C开始取三个数010,...可以得到000,001,010,101,011,111,110,100共8个二进制数且都不相同。
程序说明
以n=4为例,即有16个0,16个1,
数组a用以记录32个0,1的排法,
数组b统计二进制数是否已出现过。
程序清单
PROGRAM NOI00;
VAR
A : ARRAY[1..36] OF 0..1;
B :ARRAY[0..31] OF INTEGER;
I, J, K, S, P : INTEGER;
BEGIN
FOR I:=1 TO 36 DO A[I]:=0;
FOR I:=28 TO 32 DO A[I]:=1;
P:=1; A[6]:=1;
WHILE (P=1) DO
BEGIN
J:=27;
WHILE A[J]=1 DO J:=J-1;
a[j]:=1;
FOR I:=J+1 TO 27 DO a[i]:=0;
FOR I:=0 TO 31 DO B[I]:=0;
FOR I:=1 TO 32 DO
BEGIN
s:=0;
FOR K:=I TO I+4 DO S:=S*2+A[K];
b[s]:=1;
END;
S:=0;
FOR I:=0 TO 31 DO S:=S+B[I];
IF s=32 THEN P:=0
END;
FOR I:=1 TO 32 DO FOR J:=I TO I+4 DO WRITE(A[J]);
WRITELN
END.
2. 多项式的乘法。
例如有如下多项式:
P(X)=2X2-X+1, Q(X)=X+1
则:
P(X)•Q(X)=(2X2-X+1)(X+1)=2X3+X2+1
程序说明:
多项式的表示:系数、指数
如上例中: P(X): 系数 指数 Q(X) 系数 指数
2 2 1 1
-1 1 1 0
1 0 0 0
0 0
PXQ的结果存入C中。其输出格式是:依次用一对括号内的(系数,指数)分别来表示。如上例的输出结果表示为:(2,3)(1,2)(1,0)
程序清单
PROGRAM NOI_007;
VAR
I, J, K, L , JP, JQ, JC, X, Y, X1, Y1 : INTEGER;
P, Q : ARRAY[1..10,1..2] OF INTEGER;
C : ARRAY[1..20,1..2] OF INTEGER;
BEGIN
JP:=0;
READLN(X,Y);
WHILE X<>0 DO
BEGIN JP:=JP+1; P[JP,1]:=X; P[JP,2]:=Y; READLN(X,Y) END;
JQ:=0;
READLN(X,Y);
WHILE X<>0 DO
BEGIN JQ:=JQ+1; Q[JQ,1]:=X; Q[JQ,2]:=Y; READLN(X,Y) END;
JC:=1; C[JC,1]:=0; C[JC,2]:=-1000;
FOR I:=1 TO JP DO
BEGIN
x:=p[i,1];
Y:=P[I,2];
FOR J:=1 TO JQ DO
BEGIN
x1:=x*q[j,1];
Y1:=Y+Q[J,2];
K:=1;
WHILE Y1<C[K,2] DO K:=K+1;
IF Y1=C[K,2] THEN c[k,1]:=c[k,1]+x1
ELSE
BEGIN
FOR L:=JC DOWNTO K DO
BEGIN
C[L+1,1]:=C[L,1];
C[L+1,2]:=C[L,2]
END;
C[K,1]:=X1; C[K,2]:=Y1;
jc:=jc+1
END
END
END;
FOR I:=1 TO JC DO
IF c[i,1]<>0 THEN WRITE(‘(’,C[I,1],‘,’,C[I,2],')');
READLN
END.