POJ 3292 Semi-prime H-numbers
阿新 • • 發佈:2017-08-22
初始 table cin isp == padding edi tco turn
題意:
H_Number 是一個比4的倍數多1的數,即4n + 1。H_Number 分為 H_Prime 和 H_Comosite。其中 H_Prime 僅能由1×h組成,而 H_Composite 除了1和h可有多個因子。H_Semi_Prime 表示僅有兩個 H_Prime 因子(除了1和本身)。
問:給一個 H_Number,求出1到 H_Number 中有多少個 H_Semi_Prime。
思路:
打表,表分為三種情況,0表示H_Number,1表示H_Semi_Prime, - 1表示H_Composite。先將表都初始化為0,然後從小到大打。
#include <iostream> #include <cstring> using namespace std; const int MAX_H = 1000001; int H_number[MAX_H + 1]; int Count[MAX_H]; int H; void init() { memset(H_number, 0, sizeof(H_number)); // H_number[x]==0表示x是H_Prime; for (int i = 5; i <= MAX_H; i += 4) for (int j = 5; j <= MAX_H; j += 4) { if (i*j > MAX_H) break; if (H_number[i] == 0 && H_number[j] == 0) H_number[i*j] = 1; // 表示i*j為H_semi_Prime else H_number[i*j] = -1; // 表示i*j為H_Composite } Count[1] = 0; // 統計 for (int i = 5; i <= MAX_H; i += 4) if (H_number[i] == 1) Count[i] = Count[i - 4] + 1; else Count[i] = Count[i - 4]; } void solve() { printf("%d %d\n", H, Count[H]); } int main() { init(); while (cin >> H && H) { solve(); } return 0; }
POJ 3292 Semi-prime H-numbers