HDU 2098 分拆素数和
Time Limit: 1000/1000 MS (Java/Others)
Memory Limit: 32768/32768K (Java/Others)
【题目描述 - Problem Description】
把一个偶数拆成两个不同素数的和,有几种拆法呢?
【输入 - Input】 |
【输出 - Output】 |
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。 |
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。 |
【输入样例 - Sample Input】 |
【输出样例 - Sample Output】 |
30 26 0 |
3 2 |
【题解】
数据不大,能打表偷懒就打表偷懒吧,素数筛即可。
【代码 C++】
#include <cstdio>
#include <cstring>
#define mx 10005
int opt[mx];
void rdy(){
bool prim[mx];
memset(prim, , sizeof(prim));
prim[] = ;
int i, j;
for (i = ; i < mx; i += ){
if (prim[i]) continue;
for (j = i << ; j < mx; j += i) prim[j] = ;
}
for (i = ; i < mx; i += ){
if (prim[i]) continue;
for (++opt[j = i + ]; j < mx; j += ){
if (!prim[j] && j + i < mx) ++opt[j + i];
}
}
}
int main(){
rdy();
int a;
while (scanf("%d", &a), a) printf("%d\n", opt[a]);
return ;
}