#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 int型になりました[ 20010 ]、合計[ 20010 ]、ANS [ 20010 ]、[追加] [ 20010 ]; 構造体ノード{ int型。 int型B; 長い 長いA_B。 }ノード[ 1010 ]。 INT リード(){ int型 ANS = 0、フラグ= 1 。 チャー CH = GETCHAR()。 しばらく((CH> ' 9 ' || CH < ' 0 ')&& CH =!' - ')CH = getchar関数(); もし(CH == ' - ')フラグ= - 1、CH = GETCHAR()。 一方、(CH> = ' 0 ' && CH <= ' 9 '+ CH- ' 0 '、CH = GETCHAR()。 戻り値は * ANS フラグ。 } ボイド時間(int型X){ memset(ADD、0、はsizeof (ADD))。 以下のために(INT iが= 1 ; I <= ANS [ 0 ]; I ++ ){ 年[I] =年間[i]は* X; [I追加 + 1 ] + = ANS [I] / 10 。 年[I]%= 10 。 } 以下のために(INT iは= 1 ; I <= ANS [ 0 ] + 4 ; I ++ ){ ANS [I] + = 追加[I]。 もし(ANS [I]> = 10 ){ 歳[I + 1 ] + =年間[I] / 10 。 年[I]%= 10 。 } もし(ANS [I]!= 0 ){ 年間[ 0 ] = MAX(年間[ 0 ]、I); } } リターン; } INT divition(INT X){ memset(ADD、0、はsizeof (ADD))。 int型のq = 0 ; 用(INT I = ANS [ 0 ; I> =] 1 ; i-- ){ Q * = 10 ; Q + = 年間[i]は、 追加[I] = Q / X。 もし(ADD [ 0 ] == 0 &&追加[I]!= 0 ){ [追加0 ] = I。 } Qの%= X。 } リターン 0 ; } BOOL 比較(){ 場合(和は[ 0 ] == ADDが[ 0 ]){ ために(INTは私の追加を= [ 0 ]; I> = 1 ; i-- ){ 場合(ADD [I]>和[I] )リターン 1 。 もし(追加[I] <和[i])とリターン 0 。 } } もし(ADD [ 0 ]>和[ 0 ])リターン 1 。 もし(ADD [ 0 ] <和[ 0 ])戻り 0 。 } ボイドCP(){ memset(和、0、はsizeof (合計))。 以下のために(INT iが追加[= 0 ]; I> = 0 ; i-- ){ 合計[i]は = 追加[i]は、 } リターン; } BOOL CMP(ノード、ノードB){ 戻り a.a_b < b.a_b。 } int型のmain() { INT、N = (読み取り) 以下のために(INT iが= 0 ; I <= N; I ++ ){ ノード[I] .A = read()は、ノード[i]は.B = 読み取ります(); ノード[i]は.a_b =ノード[I] .A * ノード[i]は.B。 } ソート(ノード + 1、ノード+ N + 1 、CMP)。 ANS [ 0 ] = 1、ANS [ 1 ] = 1 。 以下のために(INT iが= 1 ; I <= N; I ++ ){ 時間(ノード[I - 1 ] .A)。 divition(ノード[I] .B)。 もし(比較()){ CP(); } } 以下のために(INT iが合計= [ 0 ]; I> = 1 ; i-- ) printf(" %dの" 、和[I])。 リターン 0 ; }