1~9の数字をいくつか足して、和が9の倍数

 投稿者:山中和義  投稿日:2013年12月10日(火)11時10分27秒
  問題
1~9の数字をいくつか足して、和が9の倍数となるような場合の数を求めたい。
ただし、足す順番は無視するものとする。
(1) 1~9の数字を最大1回だけ使えるときは何通りあるか。

答え
●「払える金額の問題」として数え上げる

その1 組合せ

LET S=0
FOR C1=0 TO 1 !数字1を0,1個
   FOR C2=0 TO 1
      FOR C3=0 TO 1
         FOR C4=0 TO 1
            FOR C5=0 TO 1
               FOR C6=0 TO 1
                  FOR C7=0 TO 1
                     FOR C8=0 TO 1
                        FOR C9=0 TO 1
                           IF MOD(C1*1+C2*2+C3*3+C4*4+C5*5+C6*6+C7*7+C8*8+C9*9,9)=0 THEN LET S=S+1
                        NEXT C9
                     NEXT C8
                  NEXT C7
               NEXT C6
            NEXT C5
         NEXT C4
      NEXT C3
   NEXT C2
NEXT C1
PRINT S; "通り"
END


その2 動的計画法

DATA 9 !種類
DATA 1,2,3,4,5,6,7,8,9 !硬貨
DATA 1,1,1,1,1,1,1,1,1 !枚数

READ N
DIM A(N),B(N)
MAT READ A
MAT READ B

LET T=0
FOR K=1 TO N
   LET T=T+A(K)*B(K)
NEXT K
PRINT "総額="; T; "円"

DIM F(0 TO T)
MAT F=ZER
LET F(0)=1 !0円
FOR K=1 TO N
   FOR i=T TO 0 STEP -1 !今までに支払える金額に対して
      LET Fi=F(i)
      IF Fi>0 THEN
         LET W=i
         FOR C=1 TO B(K) !新しい硬貨を追加する
            LET W=W+A(K)
            LET F(W)=F(W)+Fi
         NEXT C
      END IF
   NEXT i
NEXT K
MAT PRINT F;

LET S=0
FOR i=0 TO T
   IF MOD(i,9)=0 THEN LET S=S+F(i)
NEXT i
PRINT S; "通り"

END



●m進法n桁に対応させて数え上げる
個数がすべて同じなので、「m^n通り」に対応させられる。


LET S=0
FOR i=0 TO 2^9-1 !場合の数の候補
   LET T=i
   LET W=0
   FOR X=1 TO 9 !2進法9桁
      LET W=W+MOD(T,2)*X
      LET T=INT(T/2)
   NEXT X
   IF MOD(W,9)=0 THEN LET S=S+1
NEXT i
PRINT S; "通り"
END



●対称性を利用して数え上げる
1+2+3+4+5+6+7+8=36より、数字9の有無で2つに分けられ、それぞれの場合の数は同じである。
よって、1から8までの数字で考える。
・数字を0個使う場合
 0
 1通り

・数字を1個使う場合
 0通り

・数字を2個使う場合
 最小値1+2=3>0、最大値7+8=15<18なので、倍数は9
 1+8、2+7、3+6、4+5
 4通り

・数字を3個使う場合
 最小値1+2+3=6>0、最大値6+7+8=21<27なので、倍数は9,18
 1+2+6、1+3+5、2+3+4
 3+7+8、4+6+8、5+6+7
 6通り

・数字を4個使う場合
 最小値1+2+3+4=10>9、最大値5+6+7+8=26<27なので、倍数は18
 1+2+7+8、1+3+6+8、1+4+5+8、1+4+6+7、
 2+3+5+8、2+3+6+7、2+4+5+7、3+4+5+6
 8通り

8個の数字からk個選んで9の倍数をつくれる個数をN(k)とすると、N(k)=N(8-k)から、
5,6,7,8個は、6,4,0,1個となる。
これより、1+0+4+6+8+6+4+0+1=30通り

したがって、2*30=60通り


LET n=8 !1から8までの数字
DIM a(n)
MAT a=ZER
PUBLIC NUMERIC S
FOR r=0 TO n !r個を選ぶ
   LET S=0
   CALL comb(a,1,r)
   PRINT S; "通り"
NEXT r
END
EXTERNAL SUB comb(a(),k,r) !1~nの集合からr個を選ぶ組合せを生成する
IF r=0 THEN
   LET w=0
   FOR i=1 TO UBOUND(a)
      LET w=w+a(i)*i
   NEXT i
   IF MOD(w,9)=0 THEN LET S=S+1
ELSE
   FOR i=k TO UBOUND(a)-r+1 !k以降の数からr個を選択する
      LET a(i)=1
      CALL comb(a,i+1,r-1)
      LET a(i)=0
   NEXT i
END IF
END SUB


 

Re: 1~9の数字をいくつか足して、和が9の倍数

 投稿者:山中和義  投稿日:2013年12月10日(火)13時17分1秒
  > No.3215[元記事へ]

問題
1~9の数字をいくつか足して、和が9の倍数となるような場合の数を求めたい。
ただし、足す順番は無視するものとする。
(2) 1~9の数字を最大2回だけ使えるときは何通りあるか。

答え
3進法に着目して、
       1=1
     1+1=2
   3    =3
   3  +1=4
   3+1+1=5
 3+3    =6
 3+3  +1=7
 3+3+1+1=8
と、1~8までの数字が1と3のみで表される。

問題の条件を満たす場合は、2,4,5,6,7,8,9をそれぞれ0個~2個足した式に、
上の8つの式の何れかを加えて(加えられる式がもともと9の倍数の場合は加えないものとする)、
9の倍数にしたものと考えられる。
これは3^7=2187通りとなる。




> 問題
> 1~9の数字をいくつか足して、和が9の倍数となるような場合の数を求めたい。
> ただし、足す順番は無視するものとする。
> (1) 1~9の数字を最大1回だけ使えるときは何通りあるか。

●2進法に着目して数え上げる
1+2+3+4+5+6+7+8=36より、数字9の有無で2つに分けられ、それぞれの場合の数は同じである。
よって、1から8までの数字で考える。
2進法に着目して、
     1=1
   2  =2
   2+1=3
 4    =4
 4  +1=5
 4+2  =6
 4+2+1=7
と、1~7までの数字が1と2と4のみで表される。

問題の条件を満たす場合は、3,5,6,7,8をそれぞれ0個~1個足した式に、
上の7つの式の何れかを加えて(加えられる式がもともと9の倍数の場合は加えないものとする)、
9の倍数にしたものと考えられる。
これは2^5通りとなるが、その中で、
 19=5+6+8≡1 mod 9は、8を使っているので、8を足すことができないので除く。
 10=3+7≡1 mod 9は、8を足すと3+7+8と重複するので除く。
以上から、2^5-2=30通り
したがって、2*30=60通りとなる。

(補足)
最小値0、最大値3+5+6+7+8=29<36なので、倍数は0,9,18,27
9で割って余りが1になるのは、1,10,19,28であるが、1,28はつくれない。
10=3+7,19=5+6+8のみである。

0 ≡ 0
8 = 8 ≡ 8
7 = 7 ≡ 7
7+8 = 15 ≡ 6
6 = 6 ≡ 6
6+8 = 14 ≡ 5
6+7 = 13 ≡ 4
6+7+8 = 21 ≡ 3
5 = 5 ≡ 5
5+8 = 13 ≡ 4
5+7 = 12 ≡ 3
5+7+8 = 20 ≡ 2
5+6 = 11 ≡ 2
5+6+8 = 19 ≡ 1
5+6+7 = 18 ≡ 0
5+6+7+8 = 26 ≡ 8
3 = 3 ≡ 3
3+8 = 11 ≡ 2
3+7 = 10 ≡ 1
3+7+8 = 18 ≡ 0
3+6 = 9 ≡ 0
3+6+8 = 17 ≡ 8
3+6+7 = 16 ≡ 7
3+6+7+8 = 24 ≡ 6
3+5 = 8 ≡ 8
3+5+8 = 16 ≡ 7
3+5+7 = 15 ≡ 6
3+5+7+8 = 23 ≡ 5
3+5+6 = 14 ≡ 5
3+5+6+8 = 22 ≡ 4
3+5+6+7 = 21 ≡ 3
3+5+6+7+8 = 29 ≡ 2

(終り)

 

戻る