投稿者:山中和義
投稿日:2016年 4月10日(日)08時35分47秒
|
|
|
> No.4033[元記事へ]
> 問題
> 1から4の数字を使って n桁の整数を作ります。このとき、9の倍数となるものを考えましょう。
> 例えば n=3であれば、234、333、441、などが9の倍数です。必ずしも1から4の全ての数字を使う必要はありません。
> 1から4の数字を使って作るn桁の整数のうち、9の倍数となるものの個数をF(n)と定義します。
> 例えば、F(1)=F(2)=0、F(3)=10、F(4)=40 となることが確かめられます。
> 自然数n(1≦n≦20)が与えられます。
> F(n)の値を出力するプログラムを書いてください。
考察
1から4の数字を使って作るn桁の整数のうち、9で割った余りがrとなるものの個数をG(n,r)とする。
次の漸化式が成り立つ。 G(n,0)=G(n-1,8)+G(n-1,7)+G(n-1,6)+G(n-1,5)
同様に、G(n,1), G(n,2), …, G(n,8)を求める。
(終わり)
LET N=20
DIM A(9,9),B(9,9),M(9,9)
DATA 0,0,0,0,0,1,1,1,1 !G(n,0)
DATA 1,0,0,0,0,0,1,1,1 !G(n,1)
DATA 1,1,0,0,0,0,0,1,1 !G(n,2)
DATA 1,1,1,0,0,0,0,0,1 ! :
DATA 1,1,1,1,0,0,0,0,0
DATA 0,1,1,1,1,0,0,0,0
DATA 0,0,1,1,1,1,0,0,0
DATA 0,0,0,1,1,1,1,0,0
DATA 0,0,0,0,1,1,1,1,0
MAT READ A
MAT M=IDN !A^n
MAT B=A
DO UNTIL N=0 !2進法による
IF MOD(N,2)=1 THEN MAT M=M*B
MAT B=B*B
LET N=INT(N/2)
LOOP
MAT PRINT M;
END
|
|
|
投稿者:山中和義
投稿日:2016年 4月11日(月)20時12分42秒
|
|
|
> No.4035[元記事へ]
> 問題
> 1から4の数字を使って n桁の整数を作ります。このとき、9の倍数となるものを考えましょう。
> 例えば n=3であれば、234、333、441、などが9の倍数です。必ずしも1から4の全ての数字を使う必要はありません。
> 1から4の数字を使って作るn桁の整数のうち、9の倍数となるものの個数をF(n)と定義します。
> 例えば、F(1)=F(2)=0、F(3)=10、F(4)=40 となることが確かめられます。
> 自然数n(1≦n≦20)が与えられます。
> F(n)の値を出力するプログラムを書いてください。
>
> 考察
> 1から4の数字を使って作るn桁の整数のうち、9で割った余りがrとなるものの個数をG(n,r)とする。
再帰+メモ化で高速化
DECLARE EXTERNAL FUNCTION G.G
PRINT G(20,0)
END
MODULE G
SHARE NUMERIC mem(0 TO 50, 0 TO 8) !g(n,r)
MAT mem=(-1)*CON !メモ化
PUBLIC FUNCTION G
EXTERNAL FUNCTION G(n,r)
LET T=mem(n,r)
IF T<0 THEN !まだ計算していない
IF n=0 THEN !g(0,r)
LET T=0
IF r=0 THEN LET T=1
ELSE
IF r=0 THEN !漸化式による
LET T=G(n-1,8)+G(n-1,7)+G(n-1,6)+G(n-1,5) !g(n,0)
ELSEIF r=1 THEN
LET T=G(n-1,0)+G(n-1,8)+G(n-1,7)+G(n-1,6) !g(n,1)
ELSEIF r=2 THEN
LET T=G(n-1,1)+G(n-1,0)+G(n-1,8)+G(n-1,7)
ELSEIF r=3 THEN
LET T=G(n-1,2)+G(n-1,1)+G(n-1,0)+G(n-1,8)
ELSEIF r=4 THEN
LET T=G(n-1,3)+G(n-1,2)+G(n-1,1)+G(n-1,0)
ELSEIF r=5 THEN
LET T=G(n-1,4)+G(n-1,3)+G(n-1,2)+G(n-1,1)
ELSEIF r=6 THEN
LET T=G(n-1,5)+G(n-1,4)+G(n-1,3)+G(n-1,2)
ELSEIF r=7 THEN
LET T=G(n-1,6)+G(n-1,5)+G(n-1,4)+G(n-1,3)
ELSEIF r=8 THEN
LET T=G(n-1,7)+G(n-1,6)+G(n-1,5)+G(n-1,4)
END IF
END IF
LET mem(n,r)=T !再計算を避けるためにメモしておく
END IF
LET G=T
END FUNCTION
END MODULE
|
|
|