解题: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)\ ...
随机推荐
- Redis学习之路(三)之Redis主从和哨兵模式
目录 一.Redis主从配置 1.环境说明 2.修改主从的redis配置文件 3.启动主从redis 3.数据同步验证 二.Redis哨兵模式 1.Redis sentinel介绍 2.Redis S ...
- [APIO2013]机器人[搜索、斯坦纳树]
题意 题目链接 分析 记 g(d,x,y) 表示从 (x,y) 出发,方向为 d 到达的点,这个可以通过记忆化搜索求出,注意如果转移成环(此时向这个方向走没有意义)要特判. 记 f(l,r,x,y) ...
- 如何唯一确定一个 Java 类?
今天偶然想起之前和朋友讨论过的一个问题:如何唯一确定一个 Java 类?我相信大多数朋友遇到这个问题的回答都是:类的全路径呗.但事实上,唯一确定一个 Java 类,单单靠类路径是不够的,还要多加上一个 ...
- HTML 列表实例
41.无序列表本例演示无序列表.<h4>一个无序列表</h4><ul> <li>咖啡</li> <li>茶</li> ...
- Centos 7 部署Kubernetes(K8S)集群
资源链接:https://pan.baidu.com/s/1-PT_QQAf7cTu_znX-S-r9Q 密码:33sr 转发:http://blog.51cto.com/lizhenliang/19 ...
- python+Selenium 环境搭建
一.下载相关软件 1.python http://python.org/getit/ 2.setuptools http://pypi.python.org/pypi/setuptools 3.pip ...
- 普通程序员看k8s的账户管理
一.知识准备 ● 账户管理分为:userAccount与serviceAccount ● userAccount:通常是给人设计使用的,并且userAccount不在k8s集群内管理 ● servic ...
- leetcode之有序数组的平方
题目描述: 给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序. 示例 1: 输入:[-4,-1,0,3,10] 输出:[0,1,9,16,100] 示例 ...
- .net转PHP从零开始-配置visual studio 2013 PHP开发环境php for visual studio
作为一个.net开发者,一直在visual studio这款强大的编辑器宠爱下,其他编辑器都不会用,也用着不熟练.最近这不是转php吗,使用php编辑器很不爽,觉得还是用visual studio舒服 ...
- Mac OS系统 sublime text3 常用快捷键记录
个人觉得下面这些个常用的快捷键,还是有必要熟练使用的: 符号说明: ⌘:command ⌃:control ⌥:option ⇧:shift ↩:enter ⌫:delete cmd+n 新建文件(n ...