解题: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)\ ...
随机推荐
- kettle学习笔记(四)——kettle输入步骤
一.输入步骤概述 输入步骤主要分为以下几类: • 生成记录/自定义常量 • 获取系统信息 • 表输入 • 文本文件输入 • XML 文件输入 • Json输入 • 其他输入步骤 二.生成记录和自定义常 ...
- idea 中全局查找不到文件 (两shift),单页搜索不到关键字的原因
全局查找不到文件是因为把要找的目录的本级或者上级设置为了额外的,所以自然找不到 而单页搜索不到内容是因为设置了words关键字,这个要全部都输入完才能找到(也就是整个关键字进行匹配,匹配到了整体才会查 ...
- 在Windows上安装配置Git
用安装 https://git-scm.com/ 官网下载安装包 (官网有安装步骤 https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%8 ...
- cocos2d-x学习之路(一)——安装cocos2d-x
这两天想从pygame和SDL换到cocos2d-x上(主要还是为了跨平台开发),所以这里先来看看如何安装cocos2d-x. 首先到官网去下载cocos2d-x:传送门 点击上方菜单栏的Produc ...
- LevelDB原理解析
LevelDb有如下一些特点: 首先,LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上. 其次, ...
- 1082. Read Number in Chinese (25)-字符串处理
题意就是给出9位以内的数字,按照汉子的读法读出来. 读法请看下方的几个例子: 5 0505 0505 伍亿零伍佰零伍万零伍佰零伍 5 5050 5050 伍亿伍仟零伍拾万伍仟零伍拾 (原本我以为这个 ...
- PAT甲题题解-1124. Raffle for Weibo Followers-模拟,水题
水题一个,贴个代码吧. #include <iostream> #include <cstdio> #include <algorithm> #include &l ...
- 一份超全超详细的 ADB 用法大全
http://blog.csdn.net/u010375364/article/details/52344120
- 【Beta阶段】启程会议——第零次Scrum Meeting!
本次会议为Beta阶段功能的概括性介绍与任务主线的确定会议. 本次会议拟确定第二阶段各位队员的内容与主要职责 会议时长:1小时30分(因为是启程会议,所以说的比较多) 会议地点:7公寓1楼会客室 ...
- 《Linux内核分析》 第五节 扒开系统调用的三层皮(下)
<Linux内核分析> 第五节 扒开系统调用的三层皮(下) 20135307 一.给MenusOS增加time和time-asm命令 给MenuOS增加time和time-asm命令需要 ...