孤影悄然のシンデレラ

ぼくの思考のセーブポイント

Bioinformatics Contest 2019 Bee population

解答が転がってなかったので記事にさせて.

問題へのリンク

問題概要

初項 n , 係数 a,b が与えられる. 

次の漸化式で表される数列 \{n_{i}\}について  \displaystyle \lim_{i →∞} n_{i} を求めよ. 

 n_{i+1} = a・n_{i} - b・n_{i}^{2}

ただし, 正の無限大に発散する場合は -1 を,  n_{i} が負になる場合は 0 を出力すること.

制約

 0 ≦ n ≦ 10

0 ≦ a , b ≦ 3

考えたこと

n = 0 のときは絶対に 0 に収束する.

収束するならその値は  \displaystyle \frac{a-1}{b} になる.

漸化式的に正の無限大に発散することはない.

 → b = 0 は分けて考える.

 y = x y = ax - bx^{2} の位置関係を考えれば, 2項目で負にならなければそのあと負の値をとることはない.

 

細かく場合分けして書くと以下のようなコードになる.

 

t = int(input())
        
def f(n,a,b):
    if n == 0:
        return 0
    elif b == 0:
        if a < 1:
            return 0
        elif a == 1:
            return n
        else:
            return -1
    else:
        p = (a-1)/b
        if  p <= 0 or n > a/b:
            return 0
        else:
            return p
        
for i in range(t):
    n,a,b = [float(i) for i in input().split()]
    print(f(n,a,b))

 

漸化式がロジスティックモデル(生物屋目線だとロジスティックモデルは生物の個体数の変化の様子を表すモデルの1種)を背景にしているようで, いろいろ考えられて面白かった.