标签:class lang 搜索 secure include cte out style input
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 24498 | Accepted: 13326 |
Description
Input
Output
Sample Input
2 3 17 41 20 666 12 53 0
Sample Output
1 1 2 3 0 0 1 2
题意:某些数可以是连续质数的和,那么给定数a,求a的分解有几种可能。
思路:先可以用埃氏筛选找出连续的质数,之后尺取法找可能的情况,值得注意的是两组可能的连续质数序列存在元素重叠的情况,所以每找到一组,尺取法的头部和尾部统一更新为上一种情况的尾部再加1,继续查找下一种情况。。。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<algorithm> using namespace std; const int N_MAX = 10000 + 4; int prime[N_MAX],res; bool is_prime[N_MAX+1],what; int sieve(int n) { int p = 0; for (int i = 0; i <= n; i++)is_prime[i] = true; is_prime[0] = is_prime[1] = false; for (int i = 2; i <= n; i++) { if (is_prime[i]) { prime[p++] = i; for (int j = i*i; j <= n; j += i)is_prime[j] = false; } } return p; } int main() { int n=sieve(N_MAX),a; while (scanf("%d",&a)&&a) { res = 0,what = 0; int l= 0, r= 0, sum = 0; int bound=upper_bound(prime, prime + n, a)-prime; while (1) {//////// for (;;) {//// while (r < bound&&sum < a) { sum += prime[r++]; } if (sum == a) { res++; what = 1; break; } if (sum < a) {//找不到了,终止搜索; what = 0; break; } sum -= prime[l++]; }//// if (what) { l++; r = l; sum = 0; } else break; }//////// printf("%d\n", res); } return 0; }
poj 2379 Sum of Consecutive Prime Numbers
标签:class lang 搜索 secure include cte out style input
原文地址:http://www.cnblogs.com/ZefengYao/p/6480148.html