比赛 省选 2023 Day1 复现 评测结果 WAWWWWWTTWATTTTTTTTT
题目名称 城市建造 最终得分 10
用户昵称 终焉折枝 运行时间 12.276 s
代码语言 C++ 内存使用 7.46 MiB
提交时间 2026-03-02 12:02:40
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 5;
const int MOD = 998244353;
vector<int> G[MAXN];
//struct node{
//	int u, v;
//}e[105];
int n, m, k, id[MAXN];
bool vis[MAXN];
int a[MAXN], sz[MAXN];
mt19937 RP(time(0));
set<pair<int, int> > st;
//unordered_set<long long> st;

int dfs(int u, int x){
	vis[u] = 1;
	sz[u] = 1;
	int cnt = 0;
	shuffle(G[u].begin(), G[u].end(), RP);
	for(int v : G[u]){
		if(vis[v]) continue;
		cnt += dfs(v, x);
		sz[u] += sz[v];
	}
	if(x <= sz[u] && sz[u] <= x + k){
		cnt ++;
		sz[u] = 0;
	}
	return cnt;
}

//void solve(int x){
//	if(n / (x + k) < 2) return;
//	for(int i = 1;i <= 5;i ++){
//		for(int j = 1;j <= n;j ++){
//			vis[j] = 0;
//			sz[j] = 0;
//		}
//		int cnt = dfs(1, x);
//		if((!sz[1] || (sz[1] >= x && sz[1] <= x + k)) && cnt >= 2){
//			st.insert(1ll * x * MAXN + cnt + (sz[1] > 0));
//		}
//	}
//}
int main(){
	freopen("cities.in", "r", stdin);
	freopen("cities.out", "w", stdout);
	
	cin.tie(0) -> ios::sync_with_stdio(0);
	cin >> n >> m >> k;
	for(int i = 1;i <= n;i ++) a[i] = i;
	for(int i = 1;i <= m;i ++){
		int u, v; cin >> u >> v;
//		e[i] = {u, v};
		G[u].push_back(v);
		G[v].push_back(u);
	}
    for(int x = 1;x <= n;x ++){
//    	if(n / (x + k) < 2) continue;
		for(int i = 1;i <= 10;i ++){
			for(int j = 1;j <= n;j ++){
				vis[j] = 0;
			}
			int cnt = dfs(1, x);
			if(sz[1] == 0 || (sz[1] >= x && sz[1] <= x + k)){
				int bk = cnt + (sz[1] > 0);
				if(bk >= 2) st.insert({x, bk});
			}
		}
		if(k == 0){
			while(x < n && n % (x + 1) != 0) x ++;
		}
	}

    cout << st.size() % MOD << '\n';
	return 0;
}