|
> No.1726[元記事へ]
!(直線の分析)
!自然数M,Nは、M≧Nとする。
!点(x,y)は、領域0≦x≦M、0≦y≦N内の格子点とする。
!(M+1)(N+1)個の格子点の中から2つ以上の点を通る直線は何本あるか。
!参考サイト
LET M=3 !0≦x≦M
LET N=M !0≦y≦N
LET K=0 !他の線分と重なる本数
LET Z=(N+1)*(M+1) !格子点の個数
PRINT "頂点番号"
FOR i=N TO 0 STEP -1
FOR j=0 TO M
PRINT USING "###": (M+1)*i+j;
NEXT j
PRINT
NEXT i
PRINT
DIM S(MAX(M,N)-1) !通過する格子点の数iの直線の本数S(i)
MAT S=ZER
FOR A=0 TO Z-2 !組合せ C((M+1)(N+1),2)
LET XA=MOD(A,M+1) !座標へ
LET YA=INT(A/(M+1))
FOR B=A+1 TO Z-1
LET XB=MOD(B,M+1)
LET YB=INT(B/(M+1))
PRINT "("; STR$(A); ","; STR$(B); ")";
LET DX=XB-XA !線分ABのベクトルを考える
LET DY=YB-YA
LET G=gcd(ABS(DX),ABS(DY)) !正規化する
LET DXX=DX/G
LET DYY=DY/G
LET XX=XA-DXX !線分ABの点Aを延ばす
LET YY=YA-DYY
IF (XX<0 OR XX>M) OR (YY<0 OR YY>N) THEN !領域外なら
LET XX=XB+DXX !線分ABの点Bを延ばす
LET YY=YB+DYY
IF (XX<0 OR XX>M) OR (YY<0 OR YY>N) THEN !領域外なら
LET FLG=0
ELSE
LET FLG=1 !点B'あり
END IF
ELSE
LET FLG=1 !点A'あり
END IF
IF FLG=1 THEN !線分A'B, AB'に重なる
LET K=K+1
PRINT " ×";
END IF
LET W=G-1 !通過する格子点の数
IF W>0 THEN
PRINT W;
IF FLG=0 THEN LET S(W)=S(W)+1
END IF
PRINT
NEXT B
NEXT A
LET W=COMB((M+1)*(N+1),2)
PRINT "格子点の選び方は、"; W; "通り"
PRINT "重なるのは、"; K; "通り"
PRINT "よって、"; W-K; "通り"
MAT PRINT S;
!(三角形の形状の分析)
!自然数M,Nは、M≧Nとする。
!点(x,y)は、領域0≦x≦M、0≦y≦N内の格子点とする。
!(M+1)(N+1)個の格子点から3つを選んでできる点(x,y)の組を頂点とする三角形を分類せよ。
!
!(1)三角形
!(2)三角形が不成立
!参考サイト
!三角形が不成立は、3点が一直線上に並ぶときである。
!したがって、上記の結果を利用して得られる。
LET W=0
FOR i=1 TO MAX(M,N)-1
LET W=W+S(i)*COMB(i+2,3)
NEXT i
PRINT COMB((M+1)*(N+1),3)-W; "通り"
END
EXTERNAL FUNCTION gcd(a,b) !最大公約数
DO UNTIL b=0
LET t=b
LET b=MOD(a,b)
LET a=t
LOOP
LET gcd=a
END FUNCTION
実行結果
頂点番号
12 13 14 15
8 9 10 11
4 5 6 7
0 1 2 3
(0,1) ×
(0,2) × 1
(0,3) 2
(0,4) ×
(0,5) ×
(0,6)
(0,7)
(0,8) × 1
(0,9)
(0,10) × 1
(0,11)
(0,12) 2
(0,13)
(0,14)
(0,15) 2
(1,2) ×
(1,3) × 1
(1,4)
(1,5) ×
(1,6) ×
(1,7)
(1,8)
(1,9) × 1
(1,10)
(1,11) 1
(1,12)
(1,13) 2
(1,14)
(1,15)
(2,3) ×
(2,4)
(2,5) ×
(2,6) ×
(2,7)
(2,8) 1
(2,9)
(2,10) × 1
(2,11)
(2,12)
(2,13)
(2,14) 2
(2,15)
(3,4)
(3,5)
(3,6) ×
(3,7) ×
(3,8)
(3,9) × 1
(3,10)
(3,11) × 1
(3,12) 2
(3,13)
(3,14)
(3,15) 2
(4,5) ×
(4,6) × 1
(4,7) 2
(4,8) ×
(4,9) ×
(4,10)
(4,11)
(4,12) × 1
(4,13)
(4,14) 1
(4,15)
(5,6) ×
(5,7) × 1
(5,8) ×
(5,9) ×
(5,10) ×
(5,11)
(5,12)
(5,13) × 1
(5,14)
(5,15) × 1
(6,7) ×
(6,8)
(6,9) ×
(6,10) ×
(6,11) ×
(6,12) × 1
(6,13)
(6,14) × 1
(6,15)
(7,8)
(7,9)
(7,10) ×
(7,11) ×
(7,12)
(7,13) 1
(7,14)
(7,15) × 1
(8,9) ×
(8,10) × 1
(8,11) 2
(8,12) ×
(8,13)
(8,14)
(8,15)
(9,10) ×
(9,11) × 1
(9,12) ×
(9,13) ×
(9,14) ×
(9,15)
(10,11) ×
(10,12)
(10,13) ×
(10,14) ×
(10,15) ×
(11,12)
(11,13)
(11,14)
(11,15) ×
(12,13) ×
(12,14) × 1
(12,15) 2
(13,14) ×
(13,15) × 1
(14,15) ×
格子点の選び方は、 120 通り
重なるのは、 58 通り
よって、 62 通り
4 10
516 通り
|
|