求助 理论算法复杂度 正确,但是TLE到不能TLE的代码
查看原帖
求助 理论算法复杂度 正确,但是TLE到不能TLE的代码
482730
aSunnyDay楼主2022/9/4 10:18

外面一层,是 O(logn)O(logn)

里面一层,根号分治,是 O(n)O(\sqrt n) 的牛逼复杂度。

那我寻思着这不用TLE啊!!! n5×1011n≤5×10^{11}

我的RP还是太垃圾

#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;
}
2022/9/4 10:18
加载中...