白駿解題-少数連続1644回
📜 理解问题
1つ以上の連続する少数の和が表すことができる自然数がある.いくつかの自然数の例を挙げると以下のようになります.
3:3(1種)
41:2+3+5+7+11+13=11+13+17=41(3種類)
53:5+7+11+13+17=53(両方)
しかし、いくつかの自然数は連続的な少数の和で表すことができず、20は一例である.7+13を計算すると20ですが、7と13は連続していないので適切な表現ではありません.また、小数は1回の加算にしか使用できないため、3+5+7のような表現にも適していない.
自然数が与えられた場合、連続する小数の和で自然数を表すことができる場合は、プログラムを作成して解きます.
💡 問題の再定義
自然数Nが連続する小数の和として表すことができれば、数字を出力する.
▼▼▼計画作成
この問題は2つの段階を経なければならない.
いちじしょうすうけってい
まずNまでの数字の中から少数を選ぶ.時間の複雑さを減らすために、エラトステネスのふるいを用いて素数を求める.
二次部分和
部分和を求めるときは、その値がNであるかを確認します.この場合,自然数Nの範囲は400万であるため,ダブルポインタで実現できるO(N),すなわち線形時間で解決可能なアルゴリズムを用いる必要がある.
💻 計画の実行
if __name__ == '__main__':
N = int(input())
if N == 1:
print(0)
else:
nums = [1 for i in range(N+1)]
prime_nums = []
# 에라토스테네스의 체
for i in range(2, N+1):
if nums[i]:
prime_nums.append(i)
for j in range(i, N+1, i):
nums[j] = 0
start = 0
end = 0
prime_nums_len = len(prime_nums)
prime_sum = 0
result = 0
while True:
if prime_sum >= N:
if prime_sum == N:
result += 1
prime_sum -= prime_nums[start]
start += 1
else:
if end == prime_nums_len:
prime_sum -= prime_nums[start]
start += 1
else:
prime_sum += prime_nums[end]
end += 1
if start == end:
break
print(result)
🤔 振り返る
問題自体は少数の判定と投票者の組み合わせであり,二つの段階を正しく解決できれば容易に解決できる問題である.
Reference
この問題について(白駿解題-少数連続1644回), 我々は、より多くの情報をここで見つけました https://velog.io/@delicate1290/백준-문제-풀이-소수의-연속합-1644번テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol