您的位置:首页 > 其它

【BZOJ】【P4401】【块的计数】【题解】【???】

2016-01-16 18:57 281 查看
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4401

一开始写了一个O(约数个数*n)的……T了……

咦我记得n的约数个数好像不到O(sqrt(n))啊……(虽然肯定比logn大……)

忘记了TAT……求路过的同学告诉我n的约数个数究竟有多大……

枚举约数,统计子树size%B的个数

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int n;
vector<int>G[maxn];
int fa[maxn],siz[maxn],lef[maxn];
int B;
void dfs(int u){
siz[u]=1;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fa[u])continue;
fa[v]=u;
dfs(v);
siz[u]+=siz[v];
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int u,v;scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1);
int ans=0;
static int cnt[maxn];
for(int i=1;i<=n;i++)cnt[siz[i]]++;
for(int i=1;i<=n;i++)if(n%i==0){
int cot=0;
for(int j=i;j<=n;j+=i)cot+=cnt[j];
if(cot==n/i)ans++;
}
cout<<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bzoj