solution-at-abc133-e
乱搞。
考虑对于每个点,它能染的颜色色的数量的限制是任何两个距离不大于 的不同节点。考虑直接按 序顺序染色。不用考虑每个点到底染了什么颜色,显然答案至与和它距离不大于 的不同节点已有多少个被染了色有关。直接任意钦定一种顺序跑一遍即可。
#include<bits/stdc++.h> using namespace std; #define int long long inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;} inline void write(int x){if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');} #define put() putchar(' ') #define endl puts("") const int MAX = 1e5+10; const int mod = 1e9 + 7; vector <int> g[MAX]; int n, k; bool f[MAX]; int hh[MAX]; int ans = 1; void dfs(int u, int fa){ int cnt = 0; for(int v:g[u]){ if(f[v]) cnt += hh[v], hh[u]++; else{ continue ; } } f[u] = 1; hh[u] ++; ans *= k - cnt; ans %= mod; for(int v:g[u]){ if(v == fa) continue; dfs(v, u); hh[u]++; } } void solve(){ n = read(), k = read(); for(int i = 1; i < n; i++){ int u = read(), v = read(); g[u].push_back(v); g[v].push_back(u); } dfs(1, 1); write(ans), endl; } signed main(){ int t = 1; while(t--) solve(); return 0; }
本文作者:WRuperD
本文链接:https://www.cnblogs.com/WRuperD/p/18001941
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现