#include <stdio.h>
#include <math.h>
#include <stdint.h>
#include <inttypes.h>
#pragma GCC optimize "O4"
#define TSIZE 1000
// 900+1 at least
int64_t itab[TSIZE];
int64_t ritab[TSIZE];
int smax;
const double WRATIO=6.5;
int numof2x5y(int64_t x)
{
int s=0;
for ( ; x>0; x/=5 )
s+=64-__builtin_clzll(x);
return s;
}
void init(int64_t n)
{
smax=numof2x5y(n);
itab[1]=1;
ritab[1]=n;
for ( int s=2; s<=smax; s++ )
{
int64_t d=itab[s-1];
int64_t u=n;
while ( u-d>1 ) {
int64_t c=(u+d)/2;
int r=numof2x5y(c);
if ( r<s )
d=c;
else
u=c;
}
itab[s]=u;
ritab[s]=n/u;
}
}
__attribute__((always_inline))
inline int64_t phi(int64_t t)
{
// return t-t/2-t/5+t/10;
return (t+1)/2-(t+5)/10;
}
int64_t f(int64_t n)
{
int64_t a=0;
init(n);
int64_t gborder
=sqrt(n
*WRATIO
); int sborder;
for ( sborder=smax; ritab[sborder]<gborder; sborder-- );
const int giv[4]={1,3,7,9};
for ( int i=0; i<4; i++ )
{
int64_t g=giv[i];
for ( int s=smax; s>=sborder; s-- )
for ( ; g<=ritab[s]; g+=10 )
a+=s*(n/g);
}
int64_t q=1,phiu=phi(n),phid=phi(n/2);
for ( int s=1; s<sborder; s++ )
for ( ; q<itab[s+1]; q++,phiu=phid,phid=phi(n/(q+1)) )
a+=q*s*(phiu-phid);
return a;
}
int main(void)
{
int64_t n;
}