#include
<
iostream
>
#include < algorithm >
#include < cmath >
#include < assert.h >
using namespace std;
int divisor[ 1000001 ]; // divisor[i]记录着i的一个非平凡质因数,如果i是质数则divisor[i]=0;
int dp[ 1000001 ]; // dp[i]为i的非1因子的和
int f[ 1000001 ]; // f[i]为i的真因子的和
void init()
{
// 筛
for ( int i = 2 ;i <= 1000 ;i ++ ){
if ( ! divisor[i]){
for ( int j = i * i;j <= 1000000 ;j += i){
divisor[j] = i;
}
}
}
// DP
for ( int i = 2 ;i <= 1000000 ;i ++ ){
if ( ! divisor[i]){
dp[i] = i;
}
else {
int x = divisor[i];
while (i % x == 0 ){
x *= divisor[i];
}
x /= divisor[i];
dp[i] = dp[i / divisor[i]] + x * dp[i / x] + x;
}
}
// calulate f[]
f[ 1 ] = 0 ;
for ( int i = 2 ;i <= 1000000 ;i ++ ){
f[i] = dp[i] - i + 1 ;
}
}
// 在[b,e),之间返回一个指针p,使得*(p-1) <=x && x<*p,特别地,当x<*b时返回b ,当*(e-1)<=x时返回e
int * binary( int * b, int * e, int x)
{
int * mid;
if (x <* b) return b;
if ( * (e - 1 ) <= x) return e;
while (b < e - 2 ){
mid = b + (e - b) / 2 ;
if ( * mid <= x)
b = mid;
else
e = mid + 1 ;
}
return e - 1 ;
}
int main()
{
init();
sort(f + 1 ,f + 1000000 + 1 );
int m,cnt;
while (scanf( " %d " , & m) != EOF){
cnt = binary(f + 1 ,f + 1000000 + 1 ,m) - (f + 1 );
printf( " %d " ,cnt);
}
}
#include < algorithm >
#include < cmath >
#include < assert.h >
using namespace std;
int divisor[ 1000001 ]; // divisor[i]记录着i的一个非平凡质因数,如果i是质数则divisor[i]=0;
int dp[ 1000001 ]; // dp[i]为i的非1因子的和
int f[ 1000001 ]; // f[i]为i的真因子的和
void init()
{
// 筛
for ( int i = 2 ;i <= 1000 ;i ++ ){
if ( ! divisor[i]){
for ( int j = i * i;j <= 1000000 ;j += i){
divisor[j] = i;
}
}
}
// DP
for ( int i = 2 ;i <= 1000000 ;i ++ ){
if ( ! divisor[i]){
dp[i] = i;
}
else {
int x = divisor[i];
while (i % x == 0 ){
x *= divisor[i];
}
x /= divisor[i];
dp[i] = dp[i / divisor[i]] + x * dp[i / x] + x;
}
}
// calulate f[]
f[ 1 ] = 0 ;
for ( int i = 2 ;i <= 1000000 ;i ++ ){
f[i] = dp[i] - i + 1 ;
}
}
// 在[b,e),之间返回一个指针p,使得*(p-1) <=x && x<*p,特别地,当x<*b时返回b ,当*(e-1)<=x时返回e
int * binary( int * b, int * e, int x)
{
int * mid;
if (x <* b) return b;
if ( * (e - 1 ) <= x) return e;
while (b < e - 2 ){
mid = b + (e - b) / 2 ;
if ( * mid <= x)
b = mid;
else
e = mid + 1 ;
}
return e - 1 ;
}
int main()
{
init();
sort(f + 1 ,f + 1000000 + 1 );
int m,cnt;
while (scanf( " %d " , & m) != EOF){
cnt = binary(f + 1 ,f + 1000000 + 1 ,m) - (f + 1 );
printf( " %d " ,cnt);
}
}