#include using namespace std; using ll=long long; const int MAX=1000000; bitset isprime; void sieve(){ for(int i=3; i divs, pc; inline ll idx(ll x){ return (x<=sq)?x-1:(ll)divs.size()-n/x; } void calc(){ sieve(); while((sq+1)*(sq+1)<=n) sq++; for(int i=1; i<=sq; i++) divs.push_back(i); for(int i=sq; i>=1; i--) if(n/i>sq) divs.push_back(n/i); int k=0; isq=-1; for(int i=2; isq && isq==-1) isq=k; k++; } } } void primecount(){ vector dp=divs; pc.resize(divs.size(), -1); int l; for(l=0; l=l; j--){ int k=idx(divs[j]/p[i-1]); if(pc[k]!=-1) dp[j]-=pc[k]-i+2; else dp[j]-=dp[k]; } for(int j=l; j prime; ll ans; void dfs(int k, ll x, ll phi){ for(int i=k; in/prime[i]) break; ll y=x*prime[i], phiy=phi*(prime[i]-1); ans+=pc[idx(n/phiy)]-(i+1); dfs(i+1, y, phiy); while(phiy<=n/prime[i]){ y*=prime[i], phiy*=prime[i]; ans+=1+max(0ll, pc[idx(n/phiy)]-(i+1)); dfs(i+1, y, phiy); } } } int main() { cin>>n; calc(); primecount(); for(int i=2; i