ピットを残し、書きません...
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型の N = 44725 ; INT S、P [N]、ANS [N]。 BOOL VIS [N]。 ボイドget_prime(){ ため(int型 I = 2 ; iは= N <; ++ I){ 場合(VIS [I]!)P [++のp [ 0 ] = I。 用(INTの J = 1 ; J <= pが[ 0 ] && iがP [j]は<= N *; ++ j)を{ VIS [iが Pを* [J] = 1 。 もし(I%P [J] == 0)ブレーク; } } } インラインブール PD(INT X){ もし(x == 1)戻り 0 ; INT TMP = SQRT(X)。 以下のために(int型 I = 2 ; I <= TMP; ++ I)の 場合(Xの%I == 0)戻り 0 ; リターン 1 ; } ボイド DFS(int型のx、int型今、INT RES){ 場合(今== 1){ANS [++ ANS [0 ] =のRES。返す;} 場合(現在> P [X] && PD(NOW- 1 )) [ANS ++ ANS [ 0 ] =のRES *(NOW- 1 )。 用(int型 I = xを、P [I] * P [I] <=今; ++ I){ ため(INT T = P [i]を、J = P [I] + 1 ;今J <=; T * = P [i]は、J + = T) 場合には(現在%のJの== 0)DFS(I + 1、今/ jは、* resは)T。 } } int型のmain(){ get_prime()。 しばらく(〜のscanf(" %d個"、& S)){ 年間[ 0 ] = 0 ; DFS(1、S、1 ); ソート(年齢 + 1、+年年間[ 0 ] + 1 ); printf(" %d個の\ n "、年[ 0 ])。 以下のために(int型 i = 1 ; iは年間[< 0 ++;] I) (printfの" %dを" 、年[I])。 もし(年間[ 0 ])のprintf(" %d個の\ nを"、年[年[ 0 ]); } リターン 0 ; }