[CCC 2018] 平衡树

题面在这里!

    根据题目描述就可以直接模拟出一个暴力。

    如果把前 n^(1/2) 的树的方案数先一遍 O(n^(3/4)) 暴力预处理出来(其实复杂度并到不了这个级别),然后把n带进来直接暴力算就行了。

    顺便说一下这个玩意好像就是杜教筛的复杂度?

    只不过预处理不了 O(n^(2/3)),但是效果也不错了,毕竟n只有1e9。。

#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const int N=40005;

int n,M;
ll ans[N];
unordered_map<int,ll> mmp;

inline void init(){
	ans[1]=ans[2]=1;
	for(int i=3;i<=M;i++)
	    for(int j=2,k,now;j<=i;j=k+1){
	    	now=i/j,k=i/now;
	    	ans[i]+=ans[now]*(ll)(k-j+1);
		}
}

inline ll Get(int x){
	if(x<=M) return ans[x];
	if(mmp.count(x)) return mmp[x];
	
	ll an=0;
	for(int i=2,j,now;i<=x;i=j+1){
		now=x/i,j=x/now;
		an+=Get(now)*(ll)(j-i+1);
	}
	
	mmp[x]=an;
	return an;
}

int main(){
	scanf("%d",&n),M=sqrt(n+0.5)+1;
	init(),printf("%llu\n",Get(n));
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/JYYHH/p/9500566.html
ccc