【コメント】
愛知県 迷子の雄猫 さんからのご指摘ですが、問題2と同じ条件で、となりあう3つの数の積が全て平方数になるようにすることはできるでしょうか。
◆愛知県 Y.M.Ojisan さんからの解答
【コメントの問題】
できない。
連続する4数をα,β,γ,δとするとき、
α*β*γ=P2、β*γ*δ=Q2(P,Qは自然数)です。
| これより | α δ | =( | P Q | ) | 2 | であるので |
α=XP2、δ=XQ2でなければなりません。
つまり3とびにXN2(X:非平方数)でなければなりません。
ところが2003は3と互いに素で輪になっているので、全部XN2でなければなりません。
この場合隣接3数の積はX3M2の形に限られ、Xは非平方数なので積を平方数にはできません。
なお、来年なら3の倍数なのでabN2、bcN2、caN2の繰り返しで可能です。
9個の場合を右に示します。
2、3、6、8、12、24、18、27、54
【問題1】
12+34*56+78+9=2003
【P.S.】
この問題、2004年も使えるようです。
さらに2007〜2029年も使え、これから100年のうちの80%程は解があります。
なお近いところで2014年は解が唯一であり、忘れたころに再利用するには最適でしょう。
【問題2】
可能
平方数を異なる2数の積に分けるとき、
平方数がA2の場合は1とA2しかなく、たくさん作れない。
平方数がA2B2の場合はA2とB2しかなく共に平方数になり不可である。
従って、少なくとも平方数はA2B2C2の形であり、
隣接2数はA2BとBC2である。
この関係はBD2、BE2 。。。というように幾らでも付け足すことが可能である。
また隣接に限らず任意の組み合わせでもOKであり、輪になってもかまわない。
たとえば、2n2 など 異なる2003個の自然数の列の平方×非平方数で可能。
◆東京都の中学校3年生 紅孔雀 さんからの解答
【問題1】
ア イ ウ エ オ カ キ ク
1_2_3_4_5_6_7_8_9
ア なし
イ +
ウ なし
エ ×
オ なし
カ +
キ なし
ク +
12+34×56+78+9=12+78+9+(34×56)
=99+1904
=2003となります。
【問題2】
答えは「できる」です。
【1つ目の考え方】
| X+1個 目の数字 | 数字の式 | 数字 |
| 0 | 2 | 2 |
| 1 | 2*41 | 8 |
| 2 | 2*42 | 32 |
| 3 | 2*43 | 128 |
| 4 | 2*44 | 512 |
| 5 | 2*45 | 2048 |
| 6 | 2*46 | 8192 |
| 7 | 2*47 | 32768 |
| 8 | 2*48 | 131072 |
| 9 | 2*49 | 524288 |
| 10 | 2*410 | 2097152 |
| ・・・・・・ | ||
| 2000 | 2*42000 | 2.6364081868618862002077795884732e+1204 |
| 2001 | 2*42001 | 1.0545632747447544800831118353893e+1205 |
| 2002 | 2*42002 | 4.2182530989790179203324473415571e+1205 |
となり、数字は平方数でなく、隣り合う2つの数字の積は平方数となります。
1個目と2003個目の積も同じです。
【2つ目の考え方】
| X+1個 目の数字 | 数字の式 | 数字 |
| 0 | 2 | 2 |
| 1 | 2×101×2 | 200 |
| 2 | 2×102×2 | 20000 |
| 3 | 2×103×2 | 2000000 |
| 4 | 2×104×2 | 200000000 |
| 5 | 2×105×2 | 20000000000 |
| 6 | 2×106×2 | 2000000000000 |
| 7 | 2×107×2 | 200000000000000 |
| 8 | 2×108×2 | 20000000000000000 |
| 9 | 2×109×2 | 2000000000000000000 |
| 10 | 2×1010×2 | 200000000000000000000 |
| ・・・・・・ | ||
| 2000 | 2×102000×2 | 20000....(2の後に0が4000個) |
| 2001 | 2×102001×2 | 20000....(2の後に0が4002個) |
| 2002 | 2×102002×2 | 20000....(2の後に0が4004個) |
となり、数字は平方数でなく、隣り合う2つの数字の積は平方数となります。
1個目と2003個目の積も同じです。
1個目を除いて、2個目以降の数字の式が、
(N+1)個目の場合…2×10N×2となり
2の後の0の個数が(Nは自然数、N×2は偶数となり)偶数になるので、
A【(2の後に0が偶数個ある値)】×B【(2の後に0が偶数個ある値)】
=C【2の後に(AとBにあった0の個数の合計)個の0がついた値】
となりCは、D【2の後に(Cにあった0の個数の合計の1/2)個の0がついた値】の平方となります。
よって、この場合は(1個目×2個目) (2個目×3個目)・・・(2002個目×2003個目)(2003個目×1個目)と計算し、その値の平方根の正数を求めると、整数となります。
(A×B=C SQR(C)=D A,B,C,Dは自然数)
なので、円周上に平方数でない2003個の異なる自然数を並べて、となりあう2つの数の積が全て平方数になるようにすることはできる。 ということになります。
◆長野県の高校生 SATOKI さんからの解答
【問題2】
Xn を2以上の自然数とし、X1 は素数とする。
An=X1・X22・X32・・・・Xn2 とする。
このとき、{An} の初項から第2003項までの数を円周上に任意の順に並べれば良い。
●証明
An=X1・(X2・X3・ ・・・・ ・Xn)2 より平方数ではない。
1≦m<n≦2003 とする。
An・Am
=(X1・X22・・・Xm2・Xm+12・・・Xn2)×(X1・X22・・・Xm2)
=(X1・X22・・・Xm2・Xm+1・Xm+2・・・Xn)2
∴成り立つ
実例 2,23,25,27,・・・,24005
◆広島県 清川 育男 さんからの解答
【問題1】
LET S=0
FOR N=0 TO 8
LET S=S+(4^N)*COMB(8,N)
NEXT N
PRINT "S=";S
END
S= 390625
12+3*456+7*89390625通りの式から、上記の7通りが全てです。
●おまけ
逆小町算(987654321)
同じルールでは「解なし」でした。
【問題2】
出来る。
例えば、 2,23,25,.......,24001,24003 の2003個の平方数でない数を、時計回りに置けばよい。
隣同士を掛けると、指数は偶数になるから、 22n=(2n)の平方に出来る。
◆福島県の中学校3年生 おおさわ さんからの解答
【問題1】
チョット反則ですけど、自作プログラムを使って求めました。
解答は下が全てです。
1+2+34×56+7+89
1+23+45×6×7+89
12+3×456+7×89
12+34×56+78+9
1×2+345×6−78+9
1×2+3÷4×5×67×8−9
−1×2+345×6−7×8−9
−1×2+345×6+7−8×9
12+345×6−7−8×9
代数的解法は、恐らく存在しないと思われます。
解答検索プログラムはこちらです。
【青木コメント】
先頭の−を許容しているので、他の方より2つ多くなっています。
ぜひプログラムを実行してみてください。
◆東京都 明 さんからの解答
【問題1】
【問題1】 下記の7種類が解になります。
12+34*56+78+9
1*2+345*6-78+9
1*2+3/4*5*67*8-9
12+345*6-7-8*9
1+2+34*56+7+89
1+23+45*6*7+89
12+3*456+7*89
検出のためのプログラムを10進BASICで作りました。
---------------------------------
DECLARE EXTERNAL SUB KUMIAWASE
DIM X(9) ! 数値配列
DIM Y(9) ! 初期演算記号配列
DIM YY(9) ! 演算記号バッファ
DATA 1,2,3,4,5,6,7,8,9 ! 数値の定義
MAT Y=CON ! 演算記号の設定
LET Y(9)=0
REM 1:+ 2:- 3:* 4:/ 5:桁結合 0:=
LET EFLG=0
DO
RESTORE
MAT READ X ! 数値の設定
MAT YY=Y
CALL KEISAN ! 計算の実行
IF X(1)=2003 THEN ! 正解出力
LET P$=""
FOR I=1 TO 8
LET P$=P$&STR$(I)
SELECT CASE Y(I)
CASE 1
LET P$=P$&"+"
CASE 2
LET P$=P$&"-"
CASE 3
LET P$=P$&"*"
CASE 4
LET P$=P$&"/"
CASE 5
END SELECT
NEXT I
LET P$=P$&STR$(9)
PRINT P$
END IF
CALL KUMIAWASE (Y,8,5,EFLG) ! 次の演算記号配列の設定
LOOP UNTIL EFLG=1
SUB KEISAN
REM 桁結合の計算
LET I=1
LET J=1
DO
IF YY(J)=5 THEN
LET I=I+1
LET X(J)=10*X(J)+X(I)
LET YY(J)=YY(I)
ELSE
LET I=I+1
LET J=J+1
LET X(J)=X(I)
LET YY(J)=YY(I)
END IF
LOOP UNTIL YY(J)=0
IF YY(1)=0 THEN EXIT SUB
REM 乗除計算
LET I=1
LET J=1
DO
IF YY(J)=3 THEN
LET I=I+1
LET X(J)=X(J)*X(I)
LET YY(J)=YY(I)
ELSEIF YY(J)=4 THEN
LET I=I+1
LET X(J)=X(J)/X(I)
LET YY(J)=YY(I)
ELSE
LET I=I+1
LET J=J+1
LET X(J)=X(I)
LET YY(J)=YY(I)
END IF
LOOP UNTIL YY(J)=0
IF YY(1)=0 THEN EXIT SUB
REM 加減計算
LET I=1
LET J=1
DO
IF YY(J)=1 THEN
LET I=I+1
LET X(J)=X(J)+X(I)
LET YY(J)=YY(I)
ELSEIF YY(J)=2 THEN
LET I=I+1
LET X(J)=X(J)-X(I)
LET YY(J)=YY(I)
END IF
LOOP UNTIL YY(1)=0
END SUB
END
EXTERNAL SUB KUMIAWASE(Y(),N,M,EFLG)
LET J=1
DO
IF Y(J)<M THEN
LET Y(J)=Y(J)+1
EXIT DO
ELSE
LET Y(J)=1
LET J=J+1
END IF
IF J=N+1 THEN
LET EFLG=1
EXIT DO
END IF
LOOP
END SUB
--------------------------------
【問題2】
円周上に配置された数は題意によりP*N2で表せる。
ここで、Pは平方数でない数、N2は平方数(1を含む)。
隣の数はP*N2との積が平方数となることからP*M2(M≠N)とならなくてはいけない。
したがってP*N2(N=任意の自然数)を円周上に配置すればよいことになります。
最小の数で配置されたものは2*N2(N=1,2,3・・・,2003)となります。
◆埼玉県 白石 和夫 さんからの解答
【問題1】
1234+56-7+8*90 12+345*6-7-8*9+0 12+34*56+78+9+0 12+3+45*6*7+8+90 12+3*456+7*89+0 1+23+45*6*7+89+0 1+2+34*56+7+89+0 1*2+345*6-78+9+0 1*2+3/4*5*67*8-9+0
(仮称)十進BASICの有理数モードで計算しました。
*は×,/は÷と読んでください。
【青木コメント】
最後に0が入っているので、他の方より2つ多くなっています。
プログラムの比較が面白いので、そのまま掲載します。
DECLARE EXTERNAL FUNCTION interpreter.eval
CALL gen("1",2)
SUB gen(t$,n)
IF n=10 THEN
IF eval(t$) = 2003 THEN PRINT t$
ELSE
CALL gen(t$ & STR$(n), n+1)
CALL gen(t$ & "+" & STR$(n), n+1)
CALL gen(t$ & "-" & STR$(n), n+1)
CALL gen(t$ & "*" & STR$(n), n+1)
CALL gen(t$ & "/" & STR$(n), n+1)
END IF
END SUB
END
MODULE interpreter
PUBLIC FUNCTION eval
SHARE STRING s$
SHARE NUMERIC i
SHARE FUNCTION expression,term,factor,primary,NUMERIC
SHARE SUB SKIP
EXTERNAL FUNCTION eval(t$)
LET s$=t$
LET i=1
CALL SKIP
LET eval=expression
END FUNCTION
EXTERNAL SUB skip
DO WHILE s$(i:i)=" "
LET i=i+1
LOOP
END SUB
EXTERNAL FUNCTION expression
DECLARE NUMERIC n
DECLARE STRING op$
SELECT CASE s$(i:i)
CASE "-"
LET i=i+1
CALL skip
LET n=term
CASE "+"
LET i=i+1
CALL skip
LET n=term
CASE ELSE
LET n=term
END SELECT
DO WHILE s$(i:i)="+" OR s$(i:i)="-"
LET op$=s$(i:i)
LET i=i+1
CALL skip
IF op$="+" THEN LET n=n+term ELSE LET n=n-term
LOOP
LET expression =n
CALL skip
END FUNCTION
EXTERNAL FUNCTION term
DECLARE NUMERIC n
DECLARE STRING op$
LET n=factor
DO WHILE s$(i:i)="*" OR s$(i:i)="/"
LET op$=s$(i:i)
LET i=i+1
CALL skip
IF op$="*" THEN LET n=n*factor ELSE LET n=n/factor
LOOP
LET term=n
END FUNCTION
EXTERNAL FUNCTION factor
DECLARE NUMERIC n
LET n=primary
DO WHILE s$(i:i)="^"
LET i=i+1
CALL skip
LET n=n^primary
LOOP
LET factor=n
END FUNCTION
EXTERNAL FUNCTION primary
IF s$(i:i)="(" THEN
LET i=i+1
CALL skip
LET primary=expression
IF s$(i:i)=")" THEN
LET i=i+1
CALL skip
ELSE
PRINT "Syntax error"
STOP
END IF
ELSE
LET primary=numeric
END IF
END FUNCTION
EXTERNAL FUNCTION numeric
DECLARE NUMERIC i0
CALL skip
LET i0=i
DO WHILE s$(i:i)>="0" AND s$(i:i)<="9"
LET i=i+1
LOOP
LET numeric=VAL(s$(i0:i-1))
CALL skip
END FUNCTION
END MODULE
◆ 問題へもどる
◆ 今週の問題へ