平成11年10月13日追加

[流れ星]

    第29回数学的な応募問題

 <解答募集期間:9月24日〜10月9日>

[試験の採点]

 

 太郎さんの学校では、24日から定期考査が始まります。数学の試験において、20点満点の

問題を5題出題しました。各問題とも0点、5点、10点、15点、20点のいずれかで全部を

採点するつもりです。次の問に答えよ。

問題1.可能な採点方法は何通りあるか。

問題2.少なくとも3問が正解で、あとは部分点の場合の採点方法は何通りあるか。

問題3.総得点が80点以上である採点方法は何通りあるか。

 太郎さんは、採点を始める前に考えておきたいと思っています。

 

皆さん、答えがわかったら、その答えになる考え方とペンネームを添えて、

  メールで送ってください。待っています。

 

<浜田 明巳>さんからの解答9月25日受信 、10月1日更新

今回はCを使って解いてみました.

 ten1からten5(ten[1]からten[5])で各問題の点数を表し,問題1では,しらみつぶしで場合の数(kotae[1])を数えます.問題2では,3問以上20点となる(kaisuu)場合の数(kotae[2])を数えます.問題3では,合計(goukei)が80点以上となる場合の数(kotae[3])を数えます.

 このプログラムにより,

  問題1 3125通り

  問題2 181通り

  問題3 126通り

となる事が分かりました.

 /*mondai29.c*/#include<stdio.h>

void main(){int kotae[4],ten[6],ten1,ten2,ten3,ten4,ten5,j,kaisuu,goukei;

for(j=1;j<=3;j++){ kotae[j]=0;}

for(ten1=0;ten1<=20;ten1+=5){ten[1]=ten1;

for(ten2=0;ten2<=20;ten2+=5){ten[2]=ten2;

for(ten3=0;ten3<=20;ten3+=5){ten[3]=ten3;

for(ten4=0;ten4<=20;ten4+=5){ten[4]=ten4;

for(ten5=0;ten5<=20;ten5+=5){ten[5]=ten5;

kotae[1]++;

kaisuu=0;

goukei=0;

for(j=1;j<=5;j++){kaisuu+=(ten[j]==20);goukei+=ten[j];}

kotae[2]+=(kaisuu>=3);

kotae[3]+=(goukei>=80);

for(j=1;j<=5;j++){printf("%2d ",ten[j]);}

for(j=1;j<=3;j++){printf("%5d ",kotae[j]);}

printf("\n");}        

    

<水の流れ:コメント> 浜田さんから 「あまり早く掲載すると,皆のやる気がなくなるので,少し時間がたってから,掲載した方がいいのではないでしょうか?」とお言葉を頂いていましたから、解答の更新を少し遅らせました。心遣いに感謝します。10月1日に更新しました。

 

佐藤>さんからの解答10月1日受信 、10月2日更新

 現在考察していることは・・・

M系列(Reed-solomon符号)の生成多項式の判定です。

(次数 n が大きくなると結構計算時間が必要になる)

さて、以下に回答例を示します。

問題1.可能な採点方法は何通りあるか。

 一問あたり、{0,5,10,15,20}の5種類の回答点を持ち、

合計5問なので、5^5= exp(log(5)*5)=3125 <= 関数電卓での計算

<水の流れ:コメント> 佐藤さんから以下の問題をもらいました。 

逆に問題を出します。{0,1,3,5,10,20}が部分点の付け方の場合、

合計点の組み合わせは何種類あるでしょうか?

(まともに、計算することは難しそう。

コンピュータで自動計算させるのに適した問題ですね?)

 

問題2.少なくとも3問が正解で、あとは部分点の場合の採点方法は何通りあるか。

正解数は{5,4,3}で、各々のケースの和なので

各ケースで、正解・ミスありの各々の数は、{20},{15,10,5,0}で1種類、4種類

正解の箇所については、ケース分けする必要無しであるので、

各正解数に対して「ミスの位置の組み合わせ」と「ミスの仕方」を掛けることで

回答が得られる。

5問正解の場合 : 1 種類

4問正解の場合 : 5*4 = 20 種類

3問正解の場合 : (5*4/2)*(4*4) = 160 種類

組み合わせは n C m = n!/m! だったかな?

  答え: 181種類

 

問題3.総得点が80点以上である採点方法は何通りあるか。

点の損失は20点以下、各々の損失の組み合わせとして

損失 20 : {20},{15,5},{10,10},{10,5,5},{5,5,5,5}

{20} : 5  {15,5} : 20  {10,10} : 10  {10,5,5} : 5*6=30   {5,5,5,5} : 5

                                      local-sum : 52

損失 15 : {15},{10,5},{5,5,5}

{15} : 5  {10,5} : 20  {5,5,5} : 10                local-sum : 35

損失 10 :  {10},{5,5}  {10} : 5 {5,5} : 10            local-sum : 15

損失 5 : {5}  {5} : 5                         local-sum : 5

損失 0 : {0}                               local-sum : 1

                                      total : 126

 今回の課題についての、「教育課題(指針)」の予想

組み合わせに関する問題               重複ケースの削減方法の考察

効率の良い場合分け方法の考え方           比較的、手で計算しやすい出題

<水の流れ:コメント> どうもありがとうございます。今後もよろしくお願いします。

<浜田 明巳>さんからの採点の問題補題解答10月7日受信 、10月8日更新

今回は一太郎マクロで解答プログラムを作ってみました.

 プログラムの内容は以下の通りです.しらみつぶしで,部分点の合計点数(%点数)を計算し,その点数が存在するとき,%合計(%点数)の値を1とします.その%点数がない場合は%合計(%点数)の値を0とします.最後に,%点数が0から100までの間で,%合計(%点数)の値が1の%点数を数え上げ,表示します.

 このプログラムにより,答は91通りになることが分かります.

 補題 :{0,1,3,5,10,20}が部分点の付け方の場合,合計点の組み合わせは何種類あるでしょうか?

1番目 0点 2番目 1点 3番目 2点 4番目 3点 5番目 4点 6番目 5点 7番目 6点 8番目 7点 9番目 8点 10番目 9点

11番目 10点 12番目 11点 13番目 12点 14番目 13点 15番目 14点 16番目 15点 17番目 16点 18番目 17点 19番目 18点

20番目 19点 21番目 20点 22番目 21点 23番目 22点 24番目 23点 25番目 24点 26番目 25点 27番目 26点 28番目 27点

29番目 28点 30番目 29点 31番目 30点 32番目 31点 33番目 32点 34番目 33点 35番目 34点 36番目 35点 37番目 36点

38番目 37点 39番目 38点 40番目 39点 41番目 40点 42番目 41点 43番目 42点 44番目 43点 45番目 44点 46番目 45点

47番目 46点 48番目 47点 49番目 48点 50番目 49点 51番目 50点 52番目 51点 53番目 52点 54番目 53点 55番目 54点

56番目 55点 57番目 56点 58番目 57点 59番目 58点 60番目 59点 61番目 60点 62番目 61点 63番目 62点 64番目 63点

65番目 64点 66番目 65点 67番目 66点 68番目 67点 69番目 68点 70番目 69点 71番目 70点 72番目 71点 73番目 72点

74番目 73点 75番目 74点 76番目 75点 77番目 76点 78番目 78点 79番目 80点 80番目 81点 81番目 82点 82番目 83点

83番目 84点 84番目 85点 85番目 86点 86番目 88点 87番目 90点 88番目 91点 89番目 93点 90番目 95点 91番目 100点

(Handle:= ch3cooh)>さんからの解答10月8日受信 、10月9日更新

2) 補題

答えとしては「間違い」です。その理由としては、100点が満点で、1問20点MAXなので合計5問、その場合、最大点のすぐ下は1問が正解の次点で10点、ゆえに、90点(95点の組み合わせは存在しない)というだけでは、あまりにも不親切なので、C言語でプログラムを組みました。その回答を示します。正解:76通り

No1 : 0 ten 、 No.2 : 1ten 、 No.3 :2 ten 、 No.4 : 3 ten 、No.5 : 4 ten 、 No. 6 : 5 ten

No. 7 : 6 ten No. 8 : 7 ten No. 9 : 8 ten No. 10 : 9 ten No. 11 : 10 ten

No. 12 : 11 ten No. 13 : 12 ten No. 14 : 13 ten No. 15 : 14 ten No. 16 : 15 ten

No. 17 : 16 ten No. 18 : 17 ten No. 19 : 18 ten No. 20 : 19 ten No. 21 : 20 ten

No. 22 : 21 ten No. 23 : 22 ten No. 24 : 23 ten No. 25 : 24 ten No. 26 : 25 ten

No. 27 : 26 ten No. 28 : 27 ten No. 29 : 28 ten No. 30 : 29 ten No. 31 : 30 ten

No. 32 : 31 ten No. 33 : 32 ten No. 34 : 33 ten No. 35 : 34 ten No. 36 : 35 ten

No. 37 : 36 ten No. 38 : 37 ten No. 39 : 38 ten No. 40 : 39 ten No. 41 : 40 ten

No. 42 : 41 ten No. 43 : 42 ten No. 44 : 43 ten No. 45 : 44 ten No. 46 : 45 ten

No. 47 : 46 ten No. 48 : 47 ten No. 49 : 48 ten No. 50 : 49 ten No. 51 : 50 ten

No. 52 : 51 ten No. 53 : 52 ten No. 54 : 53 ten No. 55 : 54 ten No. 56 : 55 ten

No. 57 : 56 ten No. 58 : 58 ten No. 59 : 60 ten No. 60 : 61 ten No. 61 : 62 ten

No. 62 : 63 ten No. 63 : 64 ten No. 64 : 65 ten No. 65 : 66 ten No. 66 : 68 ten

No. 67 : 70 ten No. 68 : 71 ten No. 73 : 83 ten No. 74 : 85 ten No. 75 : 90 ten

No. 76 : 100 ten

以下はプログラム 簡単な説明としては、全ての点のケースのテーブル(フラグ)を用意し、組み合わせとしてありうるフラグをすべて立てた上で、それをチェックするというものです。はっきり言って、何も考えていません。組合わせの数が、300通り程度なのでこの手法でOKです。もっと膨大な組み合わせがある場合は、計算量を削減するように工夫しなくてはなりません。その例としては、(過去にC Magagineという雑誌で出た問題です。)

<start> ある10桁の数字がある。各々の桁の数字を10乗した値を加算し、その答えが、元の値の10桁を並べ直した組み合わせであるものを答えとする。<end>というようなものです。

 

#include <stdio.h>

#define TEN_X 6

#define MONDAISUU 5

#define TEN_MAX 101 // 0 to 100 need table 101

int ten_x[TEN_X]= {0,1,3,5,10,20} ;

int main( void )

{int i, j, x ; int ten_p[MONDAISUU] ;

char flg[TEN_MAX] ;// clear flg

for( i= 0 ; i< TEN_MAX ; i++ )

flg[i]= 0 ;// counter clear

for( i= 0 ; i< MONDAISUU ; i++ )

ten_p[i]= 0 ; // start count

do {x= 0 ; for( i= 0 ; i< MONDAISUU ; i++ )

{x+= ten_x[ten_p[i]] ;}

flg[x]= 1 ; i= 0 ; x= 1 ;

do { ten_p[i]++ ;if ( ten_p[i]< TEN_X ) break ;

ten_p[i]= 0 ;i++ ;

if ( i== MONDAISUU )

{x= 0 ;break ;}

} while( 1 ) ;} while ( x ) ; // count result

j= 0 ;

for( i= 0 ; i< TEN_MAX ; i++ )

{if ( flg[i]== 0 ) continue ; printf( "No. %2d : %3d ten ", ++j, i ) ;}

return 0 ;}

<水の流れ:コメント> 10月8日記入

しまった。補題の問題を読み間違えた。{0,1,3,5,10,20}が部分点の付け方の場合でしたね。こちらは、{0,1,3,5,10,15,20}が部分点の付け方の場合として、解法しました。ごめんなさい。

では、Expand[(1+x+x^3+x^5+x^10+x^20)^5]の展開式の中にすべてがあります。

<浜田 明巳>さんからの採点の問題補題解答訂正編10月12日受信 、10月13日更新

採点の問題補題解答訂正編

 先日は大変失礼しました。あの間違いは完璧に私の不手際です。申し訳有りませんでした。改めて,訂正したプログラムとデータを同封します。このプログラムにより,答は76通りになることが分かります.

一太郎マクロ errorbreakmode(0,0,0)

%点(0)=0 %点(1)=1 %点(2)=3 %点(3)=5 %点(4)=10 %点(5)=20

for %j=0 to 100 %合計(%j)=0

next for %j1=0 to 5 %jj(1)=%j1

for %j2=0 to 5  %jj(2)=%j2

for %j3=0 to 5 %jj(3)=%j3

for %j4=0 to 5 %jj(4)=%j4

for %j5=0 to 5  %jj(5)=%j5

%点数=0

for %j=1 to 5  %点数=%点数+%点(%jj(%j))

next  %合計(%点数)=1 next next  next next next

%組合せ=0 for %j=0 to 100

if %合計(%j)=1 then

%組合せ=%組合せ+1  insert(%組合せ&"番目 "&%j&"点",1)

end if next end

1番目 0点 2番目 1点 3番目 2点 4番目 3点 5番目 4点 6番目 5点 7番目 6点 8番目 7点 

9番目 8点  10番目 9点  11番目 10点 12番目 11点 13番目 12点 14番目 13点 15番目 14点

16番目 15点 17番目 16点 18番目 17点 19番目 18点 20番目 19点 21番目 20点 22番目 21点

23番目 22点 24番目 23点 25番目 24点 26番目 25点 27番目 26点 28番目 27点 29番目 28点

30番目 29点 31番目 30点 32番目 31点 33番目 32点 34番目 33点 35番目 34点 36番目 35点

37番目 36点 38番目 37点 39番目 38点 40番目 39点 41番目 40点 42番目 41点 43番目 42点

44番目 43点 45番目 44点 46番目 45点 47番目 46点 48番目 47点 49番目 48点 50番目 49点

51番目 50点 52番目 51点 53番目 52点 54番目 53点 55番目 54点 56番目 55点 57番目 56点

58番目 58点 59番目 60点 60番目 61点 61番目 62点 62番目 63点 63番目 64点 64番目 65点

65番目 66点 66番目 68点 67番目 70点 68番目 71点 69番目 73点 70番目 75点 71番目 80点

72番目 81点 73番目 83点 74番目 85点 75番目 90点 76番目 100点

 

C言語

/*hodai2*/

#include<stdio.h>

void main(){

int ten[7],goukei[102],tensuu,kumiawase,j,j1,j2,j3,j4,j5,jj[6];

ten[0]=0;

ten[1]=1;

ten[2]=3;

ten[3]=5;

ten[4]=10;

ten[5]=20;

for(j=0;j<=100;j++){goukei[j]=0;}

for(j1=0;j1<=5;j1++){jj[1]=j1;

for(j2=0;j2<=5;j2++){jj[2]=j2;

for(j3=0;j3<=5;j3++){jj[3]=j3;

for(j4=0;j4<=5;j4++){jj[4]=j4;

for(j5=0;j5<=5;j5++){jj[5]=j5;

tensuu=0;

for(j=1;j<=5;j++){tensuu+=ten[jj[j]];}

goukei[tensuu]=1;}}}}}

kumiawase=0;

for(j=0;j<=100;j++){if(goukei[j]==1){kumiawase++;printf("%d ",j);}}

printf("\n");printf("答=%d\n",kumiawase);}

<水の流れ:コメント> 10月12日記入

これで、同じ答になりました。これからもよろしくお願いします。

<自宅>  mizuryu@aqua.ocn.ne.jp

 最初のページへもどる