[Python Python]伯俊1990号の少数のパリン・ドロンプ



これは白準1990号の少数のパリンドロンの問題です.
少数の問題を見ると、私はいつもまずエラトネスのふるいを考えています.
もしあなたがエラトネスのふりをしたら、あなたは考えます.
primes = [False, False] + [True] * (n-1)
for i in range(2, n+1):
	if primes[i]:
    	print(i)
    	for j in range(2*i, n+1, i):
        	primes[j] = False
このように並ぶと1億個なので難しいですが….(タイムアウトやメモリタイムアウトが発生する可能性があります...)
とりあえずこれでぐるっと回ると
パリンドロンを小数で形成した場合、偶数桁のパリンドロンの小数は「11」(?)にしか存在しないこれを使うと範囲を大きく縮小できることがわかります.
n, m = map(int, input().split())
if m >= 10000000:
    m = 10000000
if 1000000 >= m >= 100000:
    m = 100000
if 10000 >= m >= 1000:
    m = 1000
数字の桁数が偶数なら、その桁数の最高値に変えます.
ここまでは、配列長を10,000,000個に減らしても当然タイムアウトします.
△一般的な問題は100万ぐらいあるはずです.
少数ながら偶数は‘2’のみ
  • では、エラトネスの体を表現するときに「偶数元素を入れますか?」と疑問に思うかも…?
  • primes = [False] + [True] * (m//2)
    for i in range(1, len(primes)):
        if primes[i]:
            print(2*i+1)
            for j in range(i + (2*i+1), len(primes), 2*i+1):
                primes[j] = False
    つまり,これは2を除いて配列長が半減し,少数でも求めることができる.
    今ここでパリンドロン検査をしましょう.

    コード#コード#

    def reverse(text):
        result = ''
        for t in text:
            result = t + result
        return result
    
    
    n, m = map(int, input().split())
    if m >= 10000000:
        m = 10000000
    if 1000000 >= m >= 100000:
        m = 100000
    if 10000 >= m >= 1000:
        m = 1000
    
    primes = [False] + [True] * (m//2)
    for i in range(1, len(primes)):
        if primes[i]:
            if i*2 + 1 >= n and str(i*2+1) == reverse(str(i*2+1)):
                print(2*i+1)
            for j in range(i + (2*i+1), len(primes), 2*i+1):
                primes[j] = False
    print(-1)
    これで解けて終わりだ!