[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; }
我爱学习,学习使我快乐