基本的な考え方:
品質係数の典型的な問題解決分解。問題を欠いています。
キーポイント:
SQRT(N)の1注反復使用は、特定の時間の複雑さを低減することができます。
2.具体的には、列挙時に自然な順序を発注していません。
#include <iostreamの> する#include <STDLIB.H> する#include <stdio.hに> する#include <ベクトル> の#include <ストリング> の#include <math.h>の 書式#include <アルゴリズム> の#include <CStringの> 名前空間STDを使用して、 const int型MAXN = 1000000; 構造体ノード{ int型FAC = -1。 int型CNT = 0; }。 BOOL primecharge [MAXN]。 ボイドのinit(){ //进行素数初始化; フィル(primecharge、primecharge +のMAXN、TRUE)。 primecharge [0] = primecharge [1] = FALSE; 以下のために(INT I 2 =; I <MAXN; I ++){ IF(primecharge [I]){ ため(INT J = + I、J <MAXN; J + = 1){ primecharge [I] = FALSE; } IF(フラグ){ ボイドFUNC(int型N){ int型温度= N。 ベクター<ノード>因子。 INT SQ = INT(SQRT(N))。 以下のために(INT I = 2、I <= SQ; I ++){ IF(N%I == 0){ ノードF。 f.fac = I; (N%I == 0){つつ ; //私为因子 のI / N = N。 f.cnt ++; } factor.push_back(F)。 } } もし(!N = 1){ ノードF。 f.fac = N。 f.cnt = 1。 factor.push_back(F)。 } のprintf( "%d個="、TEMP)。 ブールフラグ= TRUE。 {(I ++; I <factor.size()intは、I = 0)するための ための(int型J = 0; J <因子[I] .CNT; J ++){ printf( "%dの"、因子[I] .fac)。 フラグ= falseは、 } 他{ のprintf( "*%のD"、因子[I] .fac)。 } } } } int型のmain(){ INIT()。 int型のA、B; CIN >> B; 以下のために(INT iが=; I <= B; I ++){ FUNC(I)。 coutの<<てendl; } }