外面一层,是 O(logn)
里面一层,根号分治,是 O(n) 的牛逼复杂度。
那我寻思着这不用TLE啊!!! n≤5×1011
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,ans,cnt;
int main(){
cin>>n;//500000000000
for(ll k=2;(1<<k)<=2*n;++k){
for(ll l=1,r=0;l<=n;l=r+1){//l~r中的n/l是一样的
r=(n/(n/l));
// cout<<l<<" "<<r<<"\n";
ll ma=min(n/l,(1ll<<k)-1),mi=max(1ll,(1<<k)-n/l);
if(mi>ma) break;
if((ma&1)&&(mi&1))
ans+=(k-1)*((ma-mi)/2+1)*(r-l+1)/*,cout<<(k-1)*((ma-mi)/2+1)*/;
else if((ma&1)||(mi&1))
ans+=((ma-mi+1)/2)*(k-1)*(r-l+1)/*,cout<<((ma-mi+1)/2)*(k-1)*/;
else ans+=((ma-mi)/2)*(k-1)*(r-l+1)/*,cout<<((ma-mi)/2-1)*(k-1)*/;
}
// for(ll g=1;min(n/g,(1ll<<k)-1)>=max(1ll,(1<<k)-n/g);++g){
// ll ma=min(n/g,(1ll<<k)-1),mi=max(1ll,(1<<k)-n/g);
//// cout<<mi<<" "<<ma<<"\n";
//// cout<<"1<<"<<k<<" gcd:"<<g<<" ";
// if((ma&1)&&(mi&1))
// ans+=(k-1)*((ma-mi)/2+1)/*,cout<<(k-1)*((ma-mi)/2+1)*/;
// else if((ma&1)||(mi&1))
// ans+=((ma-mi+1)/2)*(k-1)/*,cout<<((ma-mi+1)/2)*(k-1)*/;
// else ans+=((ma-mi)/2)*(k-1)/*,cout<<((ma-mi)/2-1)*(k-1)*/;
//// cout<<"\n";
// }
}
cout<<ans;
return 0;
}