当前位置: 首页 > news >正文

P6478 [NOI Online #2 提高组] 游戏

题目

思路

非平局回合数\(k\)是不好求的,我们考虑先求钦定非平局回合数为\(k\)的数量。

这可以直接树形 dp,设 \(dp_{u,j}\)表示\(u\)为根节点钦定非平局回合数\(k\)的数量。

转移很简单直接树上背包即可,时间复杂度\(O(N^2)\)

时间复杂度证明

求出了 dp 后,设\(f_{i}\)为钦定非平局回合数\(k\)的总数量。

那么有\(f_{i}=dp_{1,i} \times (n-i)!\)(1为根节点)。

接下来直接二项式反演即可。

\(g_{i}\)表示非平局回合数恰好为\(k\)的数量。

那么有\(f_{i}= \sum_{j=k}^{n} \binom{j}{k} \times g_{j}\)

\(g_{i}=\sum_{j=k}^{n} -1^{n-j} \times \binom{j}{k} \times f_{j}\)

证明

\(g_{i}=\sum_{j=k}^{n} -1^{i-j} \times \binom{j}{k} \times f_{j}\)

\(g_{i}=\sum_{j=k}^{n} -1^{i-j} \times \binom{j}{k} \times \sum_{z=j}^{i} \binom{z}{j} \times g_{z}\)

\(g_{i}=\sum_{j=k}^{n} -1^{i-j} \times \sum_{z=k}^{i} \binom{z}{j} \times \binom{j}{k} \times g_{z}\)

\(g_{i}=\sum_{j=k}^{n} -1^{i-j} \times \sum_{z=k}^{i} \binom{z}{k} \times \binom{z-k}{j-k} \times g_{z}\)

\(g_{i}=\sum_{z=k}^{n} \binom{z}{k} \times g_{z} \times \sum_{j=k}^{i} \binom{z-k}{j-k} \times -1^{i-j}\)

最后时间复杂度\(O(N^2)\)

code
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define per(i,r,l) for(int i=(r);i>=(l);--i)const int N=5005,mod=998244353;
ll fac[N],inv[N];
ll pom(ll x,ll y,ll p){ll res=1;for(;y;y>>=1,x=x*x%p) if(y&1) res=res*x%p;return res;}
ll C(ll n,ll m){return (m<0||n<m)?0ll:fac[n]*inv[n-m]%mod*inv[m]%mod;}int n,u,v,cnt[2][N];
bool p[N];
char c;
vector<int>ve[N];
ll dp[N][N],a[N<<1];
void add(ll &x,ll y){x+=y;if(x>=mod||x<=-mod) x%=mod;if(x<0) x+=mod;}
void dfs(int u,int fa){dp[u][0]=1;for(auto v:ve[u]){if(v==fa) continue;dfs(v,u);int cu=cnt[0][u]+cnt[1][u],cv=cnt[0][v]+cnt[1][v];rep(i,0,cu+cv) a[i]=0;rep(i,0,min(cu,n)) rep(j,0,min(cv,n-i)) add(a[i+j],dp[u][i]*dp[v][j]);rep(i,0,cu+cv) dp[u][i]=a[i]; cnt[0][u]+=cnt[0][v];cnt[1][u]+=cnt[1][v];}per(i,min(cnt[0][u],cnt[1][u]),1) add(dp[u][i],dp[u][i-1]*(cnt[p[u]^1][u]-(i-1)));
}
ll f[N],g[N];
void solve(){cin>>n;auto ad=[](int u,int v){ve[u].push_back(v),ve[v].push_back(u);};rep(i,1,n) cin>>c,cnt[p[i]=(c=='1')][i]=1;rep(i,1,n-1) cin>>u>>v,ad(u,v);n>>=1;dfs(1,0);rep(i,0,n) f[i]=dp[1][i]*fac[n-i]%mod;rep(k,0,n) {ll ans=0,op=1;rep(i,k,n) add(ans,C(i,k)*f[i]*op),op*=-1;cout<<ans<<'\n';}
}
int main(){fac[0]=1;for(int i=1;i<N;++i) fac[i]=fac[i-1]*i%mod;inv[N-1]=pom(fac[N-1],mod-2,mod);for(int i=N-2;i>=0;--i) inv[i]=inv[i+1]*(i+1)%mod;solve();return 0;
}
http://www.jsqmd.com/news/614243/

相关文章:

  • Plus Jakarta Sans:开源字体的协作设计与实践指南
  • 免费使用云服务器训练深度学习模型
  • 周测复盘【前缀和and差分】
  • 革新性开源驱动:OpenTabletDriver全场景配置指南
  • 快速体验Qwen3-0.6B:FP8量化模型+Chainlit前端,简单三步上手
  • 短链接day-07 技术重点
  • AI图文识别 VS 人类学习|后Transformer时代
  • Web后端基础(SpringBoot)
  • 【初阶数据结构】连续空间的秩序之舞: 顺序表
  • 暗黑破坏神2存档编辑器:5分钟掌握游戏存档自定义的完整指南
  • OZON选品插件实战指南:新手快速上手,精准挖掘爆单AI选品的潜力
  • 房企数字化转型必看:售楼系统怎么选?信客云售楼系统深度测评
  • 涨薪技术|Prometheus监控告警处理
  • Unity发布京东小游戏颗
  • 速成正果经
  • 突破单车智能瓶颈:DAIR-V2X车路协同系统全栈实践指南
  • 《Spring AI 实战系列 入门篇》第 6 篇
  • 2025届学术党必备的五大AI学术神器横评
  • [技术突破]:跨模态语义对齐引领多模态交互变革
  • 【AI CTO视角】算力不是堆资源,而是一场精细化工程
  • C# 面试高频题:装箱和拆箱是如何影响性能的?隙
  • 2026年执医课程性价比最新测评:零基础在职考生真正用得上的课程 - 医考机构品牌测评专家
  • 2.4 复现案例:在A股复现一个经典价值因子(代码+数据)
  • 从零构建大模型--实操--搭建python环境
  • Java响应式演进关键转折点(Loom+Spring WebFlux深度耦合剖析):JDK21 GA后仅剩90天的兼容窗口期
  • java内置方法总结及基础算法
  • 008、模型优化:剪枝、量化、蒸馏与TensorRT部署加速全攻略
  • 【2026开年巨献】精通Python十讲:第十讲 - 设计模式、架构与工程化思维
  • 微信网页版浏览器扩展技术实现与架构解析
  • 从零入门性能测试:理论+JMETER实操,看完就能上手啬