首页 > 代码库 > [UVa1210]Sum of Consecutive Prime Numbers(前缀和,打表)
[UVa1210]Sum of Consecutive Prime Numbers(前缀和,打表)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3651
题意:问一个数n能拆成多少种连续的素数和。
筛出所有素数发现只有1200个,维护素数的前缀和,再打出所有区间的前缀和的表,统计出来,直接查询。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 10010; 5 bool isprime[maxn]; 6 int prime[maxn]; 7 int sum[maxn]; 8 int pcnt; 9 int n; 10 int mp[5800000]; 11 void init() { 12 memset(isprime, true, sizeof(isprime)); 13 memset(prime, 0, sizeof(prime)); 14 pcnt = 0; 15 } 16 void getPrime() { 17 init(); 18 prime[0] = prime[1] = 0; 19 for(int i = 2; i <= maxn; i++) { 20 if(isprime[i]) prime[++pcnt] = i; 21 for(int j = 1; j <= pcnt; j++) { 22 if(i * prime[j] > maxn) break; 23 isprime[i*prime[j]] = 0; 24 if(i % prime[j] == 0) break; 25 } 26 } 27 } 28 29 int main() { 30 // freopen("in", "r", stdin); 31 // freopen("out", "w", stdout); 32 getPrime(); 33 memset(sum, 0, sizeof(sum)); 34 sum[0] = prime[0]; 35 for(int i = 1; i < pcnt; i++) sum[i] = sum[i-1] + prime[i]; 36 memset(mp, 0, sizeof(mp)); 37 for(int i = 0; i < pcnt; i++) { 38 for(int j = i; j < pcnt; j++) { 39 mp[sum[j]-sum[i]]++; 40 } 41 } 42 while(~scanf("%d", &n) && n) { 43 printf("%d\n", mp[n]); 44 } 45 return 0; 46 }
[UVa1210]Sum of Consecutive Prime Numbers(前缀和,打表)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。