それを見つけるために定期的に話題になります。SQRT(n)は前列挙の数は、番号iが出現の数であるN /中/(I + 1)への回答の寄与(N /中/(I + 1))* I。
いくつかのsqrtの背後にあるためには、N / Iから直接得ることができ、一度だけ現れなければなりません。
(数学は本当に深い~~~~)
コード:
#include <ビット/ STDC ++ H>
使用して 名前空間STDを、
typedefの長い 長いLL。
ボイド(LL時間){解決
LL nは、
cinを >> N;
LL ANS = 0 。
LL C = SQRT(N)。
私はちゃいます。
以下のための式(I = 1 ; I <= C; I ++ ){
ANS + = N / I。
もし((N / I)>(N /(I +(LL)1 ))){
ANS + =((N /中/(I +(LL)1))* i)は、
}
}
私は -;
もし(N / I == I)ans- = I。
printf(" ケースは%d:%のLLD \ N " 、時間、ANS)。
}
int型のmain(){
LL T。
cinを >> トン。
以下のために(LL iは= 1 ; iが<= T; iは++ )を解決(I)。
リターン 0 ;
}