UOJ181 密码锁
题意
给你
现在这张完全图需要定向,特殊边定向方向为
你需要求出这张图的 SCC 个数的期望乘以
分析
众所周知,竞赛图有一个非常经典的性质:SCC 缩点后形成一条链,链的前部向链的后部连边。
把期望用线性性拆开,拆成“满足所有
但
设
const int maxn=40,mod=998244353,inv2=(mod+1)/2;
int n,m;
struct edge{
int u,v,zheng,fan;
}b[maxn];
vector<pii>G[maxn];
int ksm(int x,int y){
int res=1;
for(;y;y>>=1,x=x*x%mod)if(y&1)res=res*x%mod;
return res;
}
bool vis[maxn],vise[maxn];
int f[maxn],g[maxn],h[maxn];
inline void adder(int &x,int y){x+=y,x=x>=mod?x-mod:x;}
vector<int>v,e;
void dfs(int x){
if(vis[x])return;
vis[x]=1,v.emplace_back(x);
for(pii _:G[x]){
int u=_.fi,id=_.se;
if(!vise[id])e.emplace_back(id),vise[id]=1;
dfs(u);
}
}
int id[maxn];
inline void solve_the_problem(){
n=rd(),m=rd();
rep(i,1,m){
int x=rd(),y=rd(),z=rd();
b[i]=(edge){x,y,z*ksm(5000,mod-2)%mod,(10000-z)*ksm(5000,mod-2)%mod};
G[x].emplace_back(mp(y,i)),G[y].emplace_back(mp(x,i));
}
int tot=0;
g[0]=1;
rep(s,1,n)if(!vis[s]){
v.clear(),e.clear();
dfs(s);
rep(i,0,(int)v.size()-1)id[v[i]]=i;
const int U=(1<<v.size())-1;
rep(i,0,(int)v.size())f[i]=0;
rep(S,0,U){
int P=1;
for(int i:e){
int u=b[i].u,v=b[i].v;
if(((S>>id[u])&1)&&!((S>>id[v])&1))P=P*b[i].zheng%mod;
if(!((S>>id[u])&1)&&((S>>id[v])&1))P=P*b[i].fan%mod;
}
adder(f[popc(S)],P);
}
rep(i,0,tot)h[i]=g[i],g[i]=0;
rep(i,0,tot)rep(j,0,(int)v.size())adder(g[i+j],h[i]*f[j]%mod);
tot+=v.size();
}
int ans=0;
rep(i,1,n)adder(ans,g[i]*ksm(inv2,i*(n-i))%mod);
write(ans*ksm(10000,n*(n-1))%mod);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现