首页 > 代码库 > HDU2098分拆素数和【打素数表+二分】
HDU2098分拆素数和【打素数表+二分】
大素数表+二分
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 7 const int maxn = 10005; 8 int prm[maxn / 3 + 1], is[maxn / 32 + 1]; 9 int n;10 int k;11 void get() {12 int N = maxn - 5;13 k = 0;14 for(int i = 2; i <= N; i++) {15 if(( is[i / 32] & ( 1 << ( i % 32 ) ) ) == 0) {16 prm[k++] = i;17 }18 for(int j = 0; j < k && prm[j] * i <= N; j++) {19 int num = prm[j] * i;20 is[num / 32] |= ( 1 << ( num % 32) );21 if(i % prm[j] == 0) {22 break;23 }24 }25 }26 }27 bool check(int num) {28 int low = 0; int high = k - 1;29 while(low <= high) {30 int mid = ( low + high ) >> 1;31 if(prm[mid] >= num) {32 high = mid - 1;33 } else {34 low = mid + 1;35 }36 }37 if(num == prm[high + 1]) return true;38 return false;39 }40 41 int main() {42 while(scanf("%d",&n) && n) {43 get();44 int m = n / 2;45 if(!(n & 1)) m--;46 int ans = 0;47 for(int i = 0; prm[i] <= m; i++) {48 if(check(n - prm[i])) {49 ans++;50 // printf("%d %d\n", prm[i], n - prm[i]);51 }52 }53 printf("%d\n", ans);54 }55 return 0;56 }
HDU2098分拆素数和【打素数表+二分】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。