【小学期实训】附加题题解——Good Karma
[状压dp+容斥原理] 实训附加题——Good Karma
题目描述
题目
「天空度假山庄」中有一个
度假山庄已经很久没有打扫了,因此图中的边已经模糊不清。
具体来说:
- 第
条边连接的两个端点分别为 和 。 - 这条边上落下了许多灰尘,因此云浅有
的概率看不到这条边。这里保证 。
在云浅看到的图中,若
云浅想要求出这张图的「美观程度」的期望值。她还要帮
为了避免精度误差,本题的输入输出格式较为特殊,详细信息将在【输入格式】与【输出格式】中说明。
输入格式
第一行两个正整数
接下来
表示这条边的两个端点。- 云浅看不到这条边的概率即为
。
输出格式
一行一个正整数表示这张图的「美观程度」的期望值。
为了避免精度误差,你只需要求出答案对
更具体地,设答案为
可以证明这样的
数据范围
对于
测试点编号 | ||
---|---|---|
格式说明
输出时每行末尾的多余空格,不影响答案正确性
输入、输出要求
要求使用「文件输入、输出」的方式解题,输入文件为
karma.in
,输出文件为karma.out
样例输入1
4 4
1 2 1 1
2 3 1 2
3 1 1 3
2 4 2 3
样例输出1
465847375
样例输入2
2 2
1 2 1 8
2 1 2 4
样例输出2
554580200
样例解释2
图拓扑为
设
连接
故答案为
由于
Solution
注意到
解决这道题目的关键,在于状态如何设计以及如何进行转移
设
如何求出
——我们可以枚举符合条件的
因此我们可以构建一个辅助数组
如何求
如果要预处理出
注意到
即有
最后我们可以得到
答案则是:
附上代码:
#include <stdio.h>
#define N (17+5)
#define ST ((1<<17)+5)
typedef long long LL;
int n,m,sz;
LL mp[N][N];
LL w[ST],invw[ST];
LL dp[ST];
const LL p=998244353;
LL qpow(LL a,LL b,LL p){
LL res=1;
while(b){
if(b&1) res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
LL inv(LL a,LL p){
return qpow(a,p-2,p);
}
void get_w(){ //求w数组
for(int k=0;k<=sz;k++){
w[k]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
for(int k=0;k<=sz;k++){
if(k&(1<<(i-1))||k&(1<<(j-1))) continue;
int st=k;
st|=(1<<(i-1)),st|=(1<<(j-1)); //(i,j)边不连通
w[st]=(w[st]*mp[i][j])%p; //乘进w[st]中
}
}
}
for(int k=0;k<=sz;k++){ //预处理出逆元
invw[k]=inv(w[k],p);
}
}
LL g(int a,int b){ //求辅助函数g
return w[a+b]*invw[a]%p*invw[b]%p;
}
void solve(){
for(int i=1;i<=sz;i+=2){ //枚举包含点1的集合S
dp[i]=0;
for(int j=(i-1)&i;j;j=(j-1)&i){ //枚举S的子集T
if((j&1)==0) continue; //T也要包含点1
dp[i]=(dp[i]+(dp[j]*g(j,i-j))%p)%p;
}
dp[i]=(1-(dp[i])+p)%p;
}
LL ans=0;
for(int i=1;i<=sz;i+=2){
int k=0,st=i;
while(st){
if(st&1) k++;
st>>=1;
}
ans=(ans+dp[i]*g(i,sz-i)%p*k%p*k%p)%p;
}
printf("%lld\n",ans);
}
int main(){
freopen("karma.in","r",stdin);
freopen("karma.out","w",stdout);
scanf("%d%d",&n,&m);
int u,v;
LL x,y;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mp[i][j]=1;
}
}
for(int i=1;i<=m;i++){
scanf("%d%d%lld%lld",&u,&v,&x,&y);
if(u==v) continue;
mp[u][v]=mp[u][v]*x%p*inv((x+y)%p,p)%p;
mp[v][u]=mp[u][v];
}
sz=(1<<n)-1;
get_w();
solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App