1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <stdio.h> int num[4000001] = { 0 }; int prime[4000001] = { 0 }; int idx = 0; void Erasto() { for (int i = 2; i < 10000; i++) { for (int j = 2; j < 10000; j++) { if (i*j < 1000000) { // printf("%d ", i*j); num[i*j] = 1; } } } for (int i = 2; i < 1000000; i++) { if (num[i] == 0) { prime[idx++] = i; } } } int main() { Erasto(); while (1) { int n; scanf("%d", &n); if (n == 0) return 0; int left = 0, right = 0, sum = prime[0],tmp=0; while (right < n&&left <= right) { // printf("%d %d %d\n", left, right, sum); if (sum > n) { sum -= prime[left++]; if (left > right&&left<n) { right = left; sum = prime[left]; } } else if (sum < n) { sum += prime[++right]; } else { tmp++; sum += prime[++right]; } } printf("%d\n", tmp); } } | cs |
'알고리즘 > 투포인터' 카테고리의 다른 글
1806 부분합 (더블릿 부분합) (0) | 2019.02.12 |
---|---|
2003 수들의 합(2) (0) | 2019.02.12 |