【2021集训队出题】愚蠢的在线法官
【2021集训队出题】愚蠢的在线法官
by AmanoKumiko
Description
给出一颗个点的树,再给出每个点的权值
然后给出一个长度为的数组
然后对于的矩阵,,,求它的行列式
Input
第一行两个整数
第二行个数,表示权值
第三行个数表示
接下来行,读入一颗树
Output
一行一个数表示答案对取模的结果
Sample Input
3 2
1 2 3
2 3
1 2
1 3
Sample Output
5
Data Constraint
Solution
一些高代:
1.行列式交换两行取反
2.行列式中某一行提出一个公因子,行列式乘上
3.行列式中某一行中都表示成的形式,那么行列式等于取和情况下的和
4.行列式中两行相减,行列式不变
首先,如果中存在相等的数,答案是
然后我们考虑树形
设表示以为根的子树的行列式
考虑加入一个子树时的贡献
那么变成这种形式
是原答案,是子树的答案
令,那么均为
我们直接给一行减去
然后变成了
和
的形式
对于前者,我们引入一个表示在的行列式中,将某一行全部变成的答案
对于后者,我们可以继续让别的行减去,最后变为
再令
那么有
而在这种情况下,
后代求的行列式实际上是后代所有减去当前的行列式,这个随便处理一下就可以了
对于的递推,类似
然后再特判一下当前点在中的情况就行了
Code
#include<bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i=a;i<=b;i++)
#define Fd(i,a,b) for(int i=a;i>=b;i--)
#define Fs(i,a) for(int i=last[a];i;i=e[i].next)
#define LL long long
#define mo 998244353
#define N 500010
int n,k,a,b,A[N],vis[N],tot,last[N];
LL v[N],f[N],g[N],tag;
struct node{int en,next;}e[N*2];
void add(int x,int y){e[++tot]=(node){y,last[x]};last[x]=tot;}
LL mi(LL x,LL y){
if(y==1)return x;
return y%2?x*mi(x*x%mo,y/2)%mo:mi(x*x%mo,y/2);
}
void dfs(int now,int pre){
v[now]=(v[now]-tag+mo)%mo;
(tag+=v[now])%=mo;
LL fs=1;int s=0;
Fs(i,now)if(e[i].en!=pre)dfs(e[i].en,now),fs=fs*f[e[i].en]%mo,s++;
if(vis[now]){
if(!s)f[now]=v[now],g[now]=1;
else f[now]=fs*v[now]%mo,g[now]=fs;
}else{
f[now]=fs;
Fs(i,now)if(e[i].en!=pre){
LL x=mi(f[e[i].en],mo-2);
(f[now]+=fs*x%mo*g[e[i].en]%mo*v[now]%mo)%=mo;
(g[now]+=fs*x%mo*g[e[i].en]%mo)%=mo;
}
}
tag=(tag-v[now]+mo)%mo;
}
int main(){
scanf("%d%d",&n,&k);
F(i,1,n)scanf("%lld",&v[i]);
F(i,1,k){
scanf("%d",&A[i]);
if(vis[A[i]]){printf("0");return 0;}
vis[A[i]]=1;
}
F(i,1,n-1)scanf("%d%d",&a,&b),add(a,b),add(b,a);
dfs(1,0);
printf("%lld",f[1]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现