题面

WC之前写的,补一补,但是基本就是学新知识了

首先可以枚举子集$3^n$转移,优化是额外记录每个集合选取的个数,然后按照选取个数从小到大转移。转移的时候先FWT成“点值”转移完了IFWT回去乘逆元

沙茶博主也不知道为什么这样就是对的,放个没看懂的yww大佬的博客

 // luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=(<<N)+N,K=,mod=;
int mat[N][N],val[N],aset[N],deg[N],inv[N*K];
int sum[M],gain[N][M],dp[N][M],bit[M];
int n,m,p,t1,t2,all,lth;
void Mod(int &x,int y)
{
x+=y;
if(x<) x+=mod;
if(x>=mod) x-=mod;
}
int S(int x)
{
return <<(x-);
}
int Val(int x)
{
return p?(p==?x:1ll*x*x%mod):;
}
int Finda(int x)
{
return aset[x]==x?x:aset[x]=Finda(aset[x]);
}
int Calc(int sta)
{
register int i,j;
int abe=,nde=;
for(i=;i<=n;deg[i]=,i++)
if(sta&S(i)) aset[i]=i;
for(i=;i<=n;i++)
if(sta&S(i))
{
nde=i,sum[sta]+=val[i];
for(j=;j<=n;j++)
if((sta&S(j))&&mat[i][j])
deg[i]++,aset[Finda(j)]=Finda(i);
if(deg[i]%) abe=;
}
int anc=Finda(nde);
for(i=;i<=n;i++)
if(sta&S(i)) abe|=Finda(i)!=anc;
return abe*Val(sum[sta]);
}
void Trans(int *arr,int len,int typ)
{
register int i,j,k;
for(i=;i<=len;i<<=)
{
int lth=i>>;
for(j=;j<len;j+=i)
for(k=j;k<j+lth;k++)
Mod(arr[k+lth],typ*arr[k]);
}
}
void Pre()
{
register int i;
scanf("%d%d%d",&n,&m,&p),lth=<<n,all=lth-;
for(i=;i<=m;i++)
{
scanf("%d%d",&t1,&t2);
mat[t1][t2]=mat[t2][t1]=true;
}
for(i=;i<=n;i++) scanf("%d",&val[i]);
dp[][]=,inv[]=,Trans(dp[],lth,);
for(i=;i<=;i++)
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(i=;i<=all;i++)
bit[i]=bit[i>>]+(i&),gain[bit[i]][i]=Calc(i);
for(i=;i<=n;i++) Trans(gain[i],lth,);
}
int main()
{
Pre();
register int i,j,k;
for(i=;i<=n;i++)
{
for(j=;j<=i;j++)
for(k=;k<=all;k++)
Mod(dp[i][k],1ll*dp[j][k]*gain[i-j][k]%mod);
Trans(dp[i],lth,-);
for(int j=;j<=all;j++)
dp[i][j]=(bit[j]==i)?1ll*dp[i][j]*Val(inv[sum[j]])%mod:;
if(i!=n) Trans(dp[i],lth,);
}
printf("%d",dp[n][all]);
return ;
}

最新文章

  1. LeetCode-179. Largest Number
  2. FreeRTOS和Ucos在打开关闭中断的区别
  3. IOS动态判断UITextField是否输入为手机号
  4. filter:Alpha总结
  5. stitching detail输出的dot图含义
  6. 判断一个key 是否在map中存在
  7. log4net日志的配置及简单应用
  8. java 文件的基本操作
  9. Mybatis学习笔记一
  10. PEACHPIE 0.9.11 版本发布,可以上生产了
  11. vue配置手机通过IP访问,Win10让局域网内其他电脑通过IP访问网站的方法
  12. 第九章:Servlet工作原理解析
  13. python学习笔记四——循环及冒泡排序
  14. Base64与MD5的区别
  15. STM32 RTC时钟的配置
  16. Ubuntu 16.04 LTS安装Docker并使用加速器
  17. database工具
  18. 剩余参数(rest arguments) Mixin
  19. day3-set集合
  20. tyvj1048 田忌赛马

热门文章

  1. 20155301 Exp6 信息搜集与漏洞扫描
  2. mfc Unicode转 ASNI ,WCHAR 转 CHAR
  3. python 回溯法 子集树模板 系列 —— 2、迷宫问题
  4. [Deep-Learning-with-Python]机器学习基础
  5. Java英文单词Java基础常见英语词汇
  6. docker之私有仓库镜像管理
  7. 软件测试_APP测试_主要测试内容
  8. CMake与MSVC工程化实践
  9. LintCode——数字统计
  10. npm模块之http-proxy-middleware使用教程(译)