「题解」GYM 101620J Justified Jungle

「题解」GYM 101620J Justified Jungle

t=k+1,枚举 t,最多只有 d(n) 个,随便钦点一个为根,每个子树的大小都是 c=nt,易得充要条件为 sizec 倍数的树的个数 t

:对于所有分出来的连通块,其 dep 最小的节点 size 一定是 c 的倍数,所以 sizec 倍数的树的个数 t

:构造,对于每次把 size=c 的子树删除,然后更新其它点的 size.这种构造是始终存在的,即不会出现树未删完并且不存在这样的子树的情况。证明考虑同样的删法,每次把子树中不存在 sizec 的倍数且自己的 sizec 的倍数的子树删掉,删的总次数一定 <t,与假设矛盾。

实现上采用狄里克雷后缀和,时间复杂度可以到 O(nloglogn)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#define pb emplace_back
#define mp std::make_pair
#define fi first
#define se second
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll, int> pli;
typedef std::pair<ll, ll> pll;
typedef std::vector<int> vi;
typedef std::vector<ll> vll;
const ll mod = 998244353;
ll Add(ll x, ll y) { return (x+y>=mod) ? (x+y-mod) : (x+y); }
ll Mul(ll x, ll y) { return x * y % mod; }
ll Mod(ll x) { return x < 0 ? (x + mod) : (x >= mod ? (x-mod) : x); }
ll cadd(ll &x, ll y) { return x = (x+y>=mod) ? (x+y-mod) : (x+y); }
template <typename T> T Max(T x, T y) { return x > y ? x : y; }
template <typename T> T Min(T x, T y) { return x < y ? x : y; }
template <typename T>
T &read(T &r) {
	r = 0; bool w = 0; char ch = getchar();
	while(ch < '0' || ch > '9') w = ch == '-' ? 1 : 0, ch = getchar();
	while(ch >= '0' && ch <= '9') r = r * 10 + (ch ^ 48), ch = getchar();
	return r = w ? -r : r;
}
const int N = 1000100;
int n, a[N], siz[N], p[N], pct;
bool vis[N];
void pre() {
	vis[1] = 1;
	for(int i = 2; i <= n; ++i) {
		if(!vis[i]) p[++pct] = i;
		for(int j = 1; j <= pct && i * p[j] <= n; ++j) {
			vis[i*p[j]] = 1;
			if(i%p[j] == 0) break ;
		}
	}
}
vi eg[N];
void dfs(int x, int f) {
	siz[x] = 1;
	for(auto v : eg[x])
		if(v != f) {
			dfs(v, x);
			siz[x] += siz[v];
		}
	a[siz[x]]++;
}
signed main() {
	read(n); pre();
	for(int i = 1; i < n; ++i) {
		int x, y; read(x); read(y);
		eg[x].pb(y); eg[y].pb(x);
	}
	dfs(1, 0);
	for(int i = 1; i <= pct; ++i)
		for(int j = n/p[i]; j; --j)
			a[j] += a[j*p[i]];
	vi ans;
	for(int i = 2; i <= n; ++i)
		if(n % i == 0 && a[n/i] >= i)
			printf("%d ", i-1);
	return 0;
}
posted @   do_while_true  阅读(29)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
历史上的今天:
2020-10-12 Luogu P6649 「SWTR-05」Grid

This blog has running: 1845 days 1 hours 33 minutes 10 seconds

点击右上角即可分享
微信分享提示