センター試験の群数列の問題をPythonで解いてみました。(^_^;
ただし、途中の式は求めにくいので項や添え字、総和のような値だけ求めました。
第i群の項数は、i[個]で、群数列の第i群のj番目の項が原数列の第n項だとすると、次式が成り立ちます。
このとき、iとnには、次の関係も成り立ちます。四捨五入して整数化する関数をRound(x)とすると、
一般項は、次式で表されます。
ここで、k=i+1で、1≦j≦i=k-1です。
また、一般項は、次式で表すことが出来ます。これを検算用としました。(^_^;
だから
∴
ちなみに、第m群のn番目の項までの和Sは、次式のようになります。
● GrpSeqCt1.py
# coding: UTF-8 # GrpSeqCt1.py from fractions import Fraction from math import sqrt def Round(x): return int(round(x)) # int(x+.5) def main(): M = 10000 # 104以上の任意の整数、検算用にちょっと大きめにとる N = Round(sqrt(2*M)) a = ['0/1'] a+= [str(j)+'/'+str(i+1) for i in range(1,N) for j in range(1,i+1)] a+= [str(j)+'/'+str(N+1) for j in range(1,N+1) if N*(N-1)//2+j<=M] ## print(a) s = 0 for i in range(1,103+1): s+= Fraction(a[i]) print('(1) %s , %d'%(a[15],a.index('1/8'))) print('(2) %s'%a[104]) print('(3) %s'%s) print(u'//--- 検算 ---//') b = [] for n in range(M+1): i = Round(sqrt(2*n)) j = n-i*(i-1)//2 b.append(str(j)+'/'+str(i+1)) ## print(b) s = 0 for i in range(1,103+1): s+= Fraction(b[i]) print('(1) %s , %d'%(b[15],b.index('1/8'))) print('(2) %s'%b[104]) print('(3) %s'%s) print(a==b) N = 103 m = Round(sqrt(2*N)) n = N-m*(m-1)//2 s = Fraction(m*(m-1),4)+Fraction(n*(n+1),2*(m+1)) print(s) if __name__ == '__main__': main()
●実行結果
(1) 5/6 , 22 (2) 13/15 (3) 507/10 //--- 検算 ---// (1) 5/6 , 22 (2) 13/15 (3) 507/10 True 507/10
※参考URL
●大学入試センター試験|解答速報2016|予備校の東進
●知恵袋の群数列の問題をPythonで解いてみた。
●知恵袋の群数列の問題をPythonで解いてみた。(2)
●知恵袋の群数列の問題をPythonで解いてみた。(3)