解题:WC 2018 州区划分
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 州区划分的更多相关文章
- [WC 2018]州区划分
Description 题库链接 小 \(S\) 现在拥有 \(n\) 座城市,第 \(i\) 座城市的人口为 \(w_i\) ,城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 \(n ...
- WC 2018 题解
WC 2018 题解 一些感受.jpg 题目难度相较前些年会相对简单一点?(FAKE.jpg 平均码量符合WC风格?(甚至更多一点 出题人良心! [WC2018] 通道 一个不知道对不对的$\log ...
- WC 2018/CTSC 2018/APIO 2018 游记
(要写CTSC的时候才想起来没写WC2018,那就粗略回顾一下吧hhhhh) WC 2018(简略版): 大概和 一个宁夏和一个天津的大哥一个宿舍hhhh,字典序分宿舍真是奇妙. WC讲课真的不是人听 ...
- UOJ#348. 【WC2018】州区划分
原文链接www.cnblogs.com/zhouzhendong/p/UOJ348.html 前言 第一次知道子集卷积可以自己卷自己. 题解 这是一道子集卷积模板题. 设 $sum[S]$ 表示点集 ...
- [WC2018]州区划分——FWT+DP+FST
题目链接: [WC2018]州区划分 题目大意:给n个点的一个无向图,点有点权,要求将这n个点划分成若干个部分,每部分合法当且仅当这部分中所有点之间的边不能构成欧拉回路.对于一种划分方案,第i个部分的 ...
- 【WC2018】州区划分(FWT,动态规划)
[WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前 ...
- [WC2018]州区划分
[WC2018]州区划分 注意审题: 1.有序选择 2.若干个州 3.贡献是州满意度的乘积 枚举最后一个州是哪一个,合法时候贡献sum[s]^p,否则贡献0 存在欧拉回路:每个点都是偶度数,且图连通( ...
- 「WC2018」州区划分(FWT)
「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...
- UOJ348. 【WC2018】州区划分
UOJ348. [WC2018]州区划分 http://uoj.ac/problem/348 分析: 设\(g(S)=(\sum\limits_{x\in S}w_x)^p[合法]\) \(f(S)\ ...
随机推荐
- ubuntu下安装搜狗输入法
1.如果系统中未安装依赖fcitx,libssh2-1,或者依赖fcitx,libssh2-1的版本低的话,则需提前安装或者升级,否则安装输入法时会出错 安装命令 sudo apt-get insta ...
- libgdx退出对话框
package com.fxb.newtest; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; i ...
- c语言连接mysql数据库的实现方法
C语言连接mysql数据库,需要相应的头文件和lib文件,如果你安装Mysql数据库,会在安装目录下找到这些库文件,如果没有安装,也可以在网上找到 我这里也有一份网上找到的:/201205/other ...
- 测试leader职责
一. 负责软件产品/项目测试工作的组织 参加软件产品开发前的需求调研和分析 根据需求规格说明书,概要设计和开发计划编写项目总体测试计划,详细测试计划,测试大纲和测试文档结构表[测试计划 a.已上线产品 ...
- 配置LNPM
在 Ubuntu 系统中,可以使用 apt-get 命令来搭建 LNMP环境.这种方式较编译方式安装更加简便,因此选择使用该方式来搭建环境以供学习. 安装Nginx 使用 sudo apt-get i ...
- 英特尔和 Valve* 将英特尔® Embree 光线追踪技术添加至全新 Steam* Audio 插件
本文从英特尔® Embree 光线追踪技术着手,深入探讨英特尔与 Valve 合作带来的优势:一方面,开发人员使用英特尔高度优化的库创建场景,可以显著加快编译速度:另一方面,逼真的声效可以增强游戏性, ...
- leetcode-递增的三元子序列
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[ ...
- LintCode——旋转字符串
描述:给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例:对于字符串 "abcdefg" offset=0 => "abcdefg&qu ...
- C++基础知识(1)
C语言是结构化编程语言(for循环.while循环.do while循环和if else语句),将低级语言的效率.硬件访问能力和高级语言的通用性.可移植性融合在一起. UNIX编译和链接 UNIX用C ...
- 每天学一点---document.createDocumentFragment
document.createDocumentFragment 用于创建文档对象,创建好的对象存在于内存中(不会引起回流,对元素位置和几何上的运算),不是附着在DOM树上,所以有更好的性能 可将该文 ...