题面

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 ;
}

解题:WC 2018 州区划分的更多相关文章

  1. [WC 2018]州区划分

    Description 题库链接 小 \(S\) 现在拥有 \(n\) 座城市,第 \(i\) 座城市的人口为 \(w_i\) ,城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 \(n ...

  2. WC 2018 题解

    WC 2018 题解 一些感受.jpg 题目难度相较前些年会相对简单一点?(FAKE.jpg 平均码量符合WC风格?(甚至更多一点 出题人良心! [WC2018] 通道 一个不知道对不对的$\log ...

  3. WC 2018/CTSC 2018/APIO 2018 游记

    (要写CTSC的时候才想起来没写WC2018,那就粗略回顾一下吧hhhhh) WC 2018(简略版): 大概和 一个宁夏和一个天津的大哥一个宿舍hhhh,字典序分宿舍真是奇妙. WC讲课真的不是人听 ...

  4. UOJ#348. 【WC2018】州区划分

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ348.html 前言 第一次知道子集卷积可以自己卷自己. 题解 这是一道子集卷积模板题. 设 $sum[S]$ 表示点集 ...

  5. [WC2018]州区划分——FWT+DP+FST

    题目链接: [WC2018]州区划分 题目大意:给n个点的一个无向图,点有点权,要求将这n个点划分成若干个部分,每部分合法当且仅当这部分中所有点之间的边不能构成欧拉回路.对于一种划分方案,第i个部分的 ...

  6. 【WC2018】州区划分(FWT,动态规划)

    [WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前 ...

  7. [WC2018]州区划分

    [WC2018]州区划分 注意审题: 1.有序选择 2.若干个州 3.贡献是州满意度的乘积 枚举最后一个州是哪一个,合法时候贡献sum[s]^p,否则贡献0 存在欧拉回路:每个点都是偶度数,且图连通( ...

  8. 「WC2018」州区划分(FWT)

    「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...

  9. UOJ348. 【WC2018】州区划分

    UOJ348. [WC2018]州区划分 http://uoj.ac/problem/348 分析: 设\(g(S)=(\sum\limits_{x\in S}w_x)^p[合法]\) \(f(S)\ ...

随机推荐

  1. 20155222卢梓杰 实验一 逆向及Bof基础

    实验一 逆向及Bof基础 1.实验对象为32位可执行文件pwn1,这个程序主要有main.foo.getshell这三个函数,其中foo函数功能为输出输入的字符串,getshell函数功能为打开一个s ...

  2. 20155232《网络对抗》Exp3 免杀原理与实践

    20155232<网络对抗>Exp3 免杀原理与实践 问题回答 1.基础问题回答 (1)杀软是如何检测出恶意代码的? 基于特征码的检测 特征码:一段特征码就是一段或多段数据. 如果一个可执 ...

  3. [Oracle]如何为数据库设置Event(eg: ORA-00235)

    [Oracle]如何为数据库设置Event(eg: ORA-00235) ■ When you use SPFILE, Setting procedure: 1. Check the current ...

  4. python 画圆

    import numpy as np import matplotlib.pyplot as plt # ========================================== # 圆的 ...

  5. 解决Git在添加ignore文件之前就提交了项目无法再过滤问题

    由于未添加ignore文件造成提交的项目很大(包含生成的二进制文件).所以我们可以将编译生成的文件进行过滤,避免添加到版本库中了. 首先为避免冲突需要先同步下远程仓库 $ git pull 在本地项目 ...

  6. stl源码剖析 详细学习笔记 算法总览

    //****************************基本算法***************************** /* stl算法总览,不在stl标准规格的sgi专属算法,都以 *加以标 ...

  7. 基于.NET Standard的分布式自增ID算法--Snowflake代码实现

    概述 上篇文章介绍了3种常见的Id生成算法,本篇主要介绍如何使用C#实现Snowflake. 基础字段 /// <summary> /// 工作节点Id(长度为5位) /// </s ...

  8. python 微信撤回消息

    import itchatfrom itchat.content import *import osimport reimport time# 文件临时存储页rec_tmp_dir = os.path ...

  9. 每日scrum(7)

    今天是小组用来写文稿的日子,包括软件需求分析报告,概要设计报告,详细设计报告,数据库设计报告,软件测试报告,各组员领取自己的任务然后完成~ 任务看板: 燃尽图:

  10. Git 笔记——如何处理分支合并冲突

    1.前言 学习使用 Git 也有一段时间,但一直都是把 Git 当作一个代码仓库,使用的命令无非就是 clone, add, commit ,往往课程作业也没有过多人合作开发,没有体验过 Git 的分 ...