1644.少数連続和


1.ダブルポインタの説明
2.問題リンク

1.トラブルシューティング


この問題を解決するには、2つのアルゴリズムが必要です.
  • エラストマ
  • デュアルポインタ
  • 1-1. エラトステネスのふるい


    広範囲に存在する少数者を救うためにエラトステネスのふるいを利用する.
  • の小数を格納するリストを生成します.
  • において、リストには、ラテン体を用いて小数を格納する.
  • 1-2. ダブルポインタ


    エラトステネスの体を利用して、救われた少数の人を投球した.
  • 左側のインデックスは減算を繰り返します.
  • 右インデックスは、加算を繰り返します.
  • 2つのインデックスを移動し、nと現在の合計が同じである場合、状況の数が増加します.

    2.ソースコード

    //소수의 연속합
    
    import java.util.*;
    import java.io.*;
    
    public class Main {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    		int n = Integer.parseInt(br.readLine());
    
    		// 에라토스테네스 체
    		boolean[] prime = new boolean[n + 1];
    		List<Integer> prime_list = new ArrayList<>();
    		for (int i = 2; i <= n; i++) {
    			if (!prime[i]) {
    				prime_list.add(i);
    				for (int j = i; j <= n; j += i) {
    						prime[j] = true;
    				}
    			}
    		}
    
    		Collections.sort(prime_list);
    		twoPoint(n, prime_list);
    	}
    
    	private static void twoPoint(int n, List<Integer> prime_list) {
    		int left_idx = -1, right_idx = -1;
    		int sum = 0, ans = 0;
    		while (left_idx < prime_list.size()) {
    			while (++right_idx < prime_list.size()) {
    				sum += prime_list.get(right_idx);
    
    				if (sum <= n) { // 합이 n과 동일하거나 작은 경우
    					if (sum == n)
    						ans++;
    				} else // 합 > n
    					break;
    			}
    
    			while (++left_idx < prime_list.size()) {
    				sum -= prime_list.get(left_idx);
    				if (sum <= n) {
    					if (sum == n)
    						ans++;
    					break;
    				}
    			}
    		}
    
    		System.out.println(ans);
    	}
    }