[WC2018]州区划分(FWT_OR卷积)

problem

洛谷链接

solution

显然题目指向:存在欧拉回路的州划分是不合法的。

当且仅当这个州是 联通 的且 内部没有奇数度数的点 时,这个州不合法。

因为 nnn 非常小,我们可以枚举每一种州划分方案,判断是否合法,顺便记录每个划分方案的贡献。

f(s):f(s):f(s): 当前划分集合为 sss 的答案,g(s):g(s):g(s): 划分一个州为 sss 是否合法,val(s):val(s):val(s): 划分州为 sss 的贡献。

列出状态转移方程:f(s)=∑t∈sf(s−t)g(t)(val(t)val(s))pf(s)=\sum_{t\in s}f(s-t)g(t)\Big(\frac{val(t)}{val(s)}\Big)^pf(s)=tsf(st)g(t)(val(s)val(t))p

显然能看到有卷积的形式,即 f(s)=∑i⋂j=∅∧i⋃j=sf(j)g(i)(val(i)val(s))pf(s)=\sum_{i\bigcap j=\empty\wedge i\bigcup j=s}f(j)g(i)\Big(\frac{val(i)}{val(s)}\Big)^pf(s)=ij=ij=sf(j)g(i)(val(s)val(i))p

i⋃j=si\bigcup j=sij=s 可以直接用 FWT\text{FWT}FWT 做,但是 i⋂j=∅i\bigcap j=\emptyij= 就不好做了。

如果结合并集为 sss 的信息,也就意味着 ∣i∣+∣j∣=∣s∣|i|+|j|=|s|i+j=s

对于 dpdpdp 的设计可以再加一维二进制状态中 111 的个数。

f(i,s):sf(i,s):sf(i,s):s111 的个数为 iii 的答案,g(i,s):[sg(i,s):[sg(i,s):[s 成立 ]∗val(s)]*val(s)]val(s)

f(i,s)g(i,s)=∑j=0i−1∑t∈sf(j,s−t)g(i−j,t)f(i,s)g(i,s)=\sum_{j=0}^{i-1}\sum_{t\in s}f(j,s-t)g(i-j,t)f(i,s)g(i,s)=j=0i1tsf(j,st)g(ij,t)

预处理贡献和贡献的逆元,状态是否合法,直接 FWT\text{FWT}FWT 卷积即可。

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
int n, m, p, N;
int u[250], v[250], w[25], fa[25], d[25], val[1 << 21], tot[1 << 21], inv[1 << 21];
bool ok[1 << 21];
int f[22][1 << 21], g[22][1 << 21];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}void fwt( int *c, int f ) {for( int i = 1;i < N;i <<= 1 )for( int j = 0;j < N;j += ( i << 1 ) )for( int k = 0;k < i;k ++ )c[j + k + i] = ( c[j + k + i] + c[j + k] * f % mod + mod ) % mod;
}int find( int x ) { return x == fa[x] ? x : fa[x] = find( fa[x] ); }signed main() {scanf( "%lld %lld %lld", &n, &m, &p );for( int i = 1;i <= m;i ++ ) scanf( "%lld %lld", &u[i], &v[i] );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &w[i] );N = 1 << n;for( int s = 0;s < N;s ++ ) {int num = 0;for( int i = 1;i <= n;i ++ ) {if( 1 << i - 1 & s ) num ++, val[s] += w[i];d[i] = 0, fa[i] = i;}tot[s] = num;for( int i = 1;i <= m;i ++ )if( 1 << u[i] - 1 & s and 1 << v[i] - 1 & s ) {int fu = find( u[i] ), fv = find( v[i] );if( fu ^ fv ) num --, fa[fv] = fu;d[u[i]] ++, d[v[i]] ++;}if( num ^ 1 ) ok[s] = 1;num = 0;for( int i = 1;i <= n;i ++ ) num += d[i] & 1;if( num ) ok[s] = 1;if( ok[s] ) g[tot[s]][s] = qkpow( val[s], p );inv[s] = qkpow( qkpow( val[s], p ), mod - 2 );}for( int i = 0;i <= n;i ++ ) fwt( g[i], 1 );f[0][0] = 1;fwt( f[0], 1 );for( int i = 1;i <= n;i ++ ) {for( int j = 0;j < i;j ++ )for( int k = 0;k < N;k ++ )f[i][k] = ( f[i][k] + f[j][k] * g[i - j][k] ) % mod;fwt( f[i], -1 );for( int j = 0;j < N;j ++ ) f[i][j] = tot[j] == i ? f[i][j] * inv[j] % mod : 0;fwt( f[i], 1 ); }printf( "%lld\n", f[n][N - 1] );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P5469 [NOI2019] 机器人(拉格朗日插值、区间dp)

解析 打表可得&#xff0c;有效状态大概只有 O(m)O(nlog⁡n)O(m)O(n\log n)O(m)O(nlogn) 种。 枚举最靠右的最大值位置&#xff0c;不难得到 O(mV)O(mV)O(mV) 的做法。 期望得分 505050 分。 考虑如何做 l0,r109l0,r10^9l0,r109。&#xff0c;发现前缀和后所有的 dpi,i,xxdp_…

Math(牛客多校第三场)

Math 题意&#xff1a; 问你有多少对(x,y),1<x<y<n,满足(x2 y2)%(xy1) 0 题解&#xff1a; 这种题。。。直接打表芜湖~ 通过打表发现&#xff1a;满足情况的为(i,i * i * i),但是也有不和谐的声音出现&#xff1a;当x8时&#xff0c;会出现两个&#xff0c;一个…

[NewLife.XCode]增删改查入门

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

P5472 [NOI2019] 斗主地(期望、数学)

前言 我咋连表都没打啊。 too vegetable。 解析 题目给出的洗牌形式看着并不好看&#xff0c;合理猜测可以发现&#xff0c;这其实就等价于所有可能情况等概率出现。 然后就不会了 打表可以发现&#xff1a;当 tp1 时&#xff0c;dp 数组是一个等差数列。当 tp2 时&#xff…

[HNOI2012]集合选数(思维构造 + 状压dp)

problem 题目链接 solution 从最小一个数 xxx 开始&#xff0c;将其 2x,3x2x,3x2x,3x 放入&#xff0c;再将 2(2x),3(2x),2(3x),3(3x)2(2x),3(2x),2(3x),3(3x)2(2x),3(2x),2(3x),3(3x) 放入&#xff0c;以此类推 …\dots… 将其合并为一个集合。重复又找一个最小未进入集合的…

在实际项目中使用LiteDB NoSQL数据库

LiteDB 是一个 NoSQL 数据库&#xff0c;特点是 MongoDB like 和 0 配置。100% 原汁原味的 C# 开发, Release 只有一个 DLL&#xff0c;官方有一下适用场景&#xff1a;移动App&#xff0c;桌面小应用程序&#xff0c;特有的文件格式&#xff0c;小型的 Web 应用&#xff0c;需…

2021牛客暑期多校训练营3

2021牛客暑期多校训练营3 题号题目知识点AGuess and liesBBlack and whiteCMinimum grid二分图匹配DCountEMath数论打表找规律F24dian模拟GYu Ling(Ling YueZheng) and Colorful TreeHLing Qiu, Luna and Triple BackpackIKuriyama Mirai and Exclusive OrJCounting Triangles…

P4769 [NOI2018] 冒泡排序(组合数学)

前言 这里是线性做法。 在题解里几句话说清楚的性质愣是推了一上午。 too vegetable 解析 考虑怎样的排列是不合法的。 一个排列如果不合法&#xff0c;也就是在某次交换时其中一个元素距离目标的距离没有减少反而增大了&#xff0c;那么以后这个数一定会再换回来&#xff0…

[骗分技巧——随机化Ⅰ]CodeChef-Milestones,CF364D-Ghd

文章目录CodeChef-MilestonesproblemsolutioncodeCF364D-Ghdproblemsolutioncode设随机化一次的正确率为 ppp&#xff0c;一次的复杂度为 O(f(n))O(f(n))O(f(n))。则随机的期望次数 kkk&#xff1a;k∑i1∞p(1−p)i−1i(1)(1−p)k∑i1∞p(1−p)ii∑i2∞p(1−p)i−1(i−1)(2)(1)…

初探奥尔良(Orleans)

由于工作上关系目前经常被各种并发数据问题搞得焦头烂额&#xff0c;要么要性能舍弃数据上得一致性&#xff0c;要么要一致性但是却得到了特别糟糕的响应。难道鱼和熊掌真的无法兼得吗&#xff1f;然后找到了类似奥尔良这种基于Actor模型的kuangjia首先本人因为是C#系的所以暂不…

2021杭电多校1

题号题目知识点AMod, Or and Everything思维数论BRocket landCPuzzle loopDAnother thief in a ShopEMinimum spanning tree推结论欧拉筛FXor sum01字典树GPass!HMaximal submatrix单调栈IKD-GraphJzotoKNecklace of Beads

P4775 [NOI2018] 情报中心(线段树合并)

前言 似乎也没有那么难&#xff1f; 但确实也不太好想。 解析 对于两条有交路径 (u1,v1,c1),(u2,v2,c2)(u_1,v_1,c_1),(u_2,v_2,c_2)(u1​,v1​,c1​),(u2​,v2​,c2​)&#xff0c;设 tlca(u1,u1)tlca(u_1,u_1)tlca(u1​,u1​) 为四个 lca 中最深的&#xff0c;那么代价的二…

[骗分技巧——随机化Ⅱ] [Poi2014]Couriers,CodeChef - TKCONVEX

文章目录[Poi2014]CouriersproblemsolutioncodeCodeChef - TKCONVEXproblemsolutioncode随机算法的典型套路&#xff1a;枚举太花时&#xff0c;转化为随机一个数。然后通过对正确率的分析&#xff0c;选择一个随机的次数来卡。前提是要保证每一次检验随机是否为答案的时间复杂…

[NewLife.XCode]功能设置

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代表作有百亿级大数据实时计算项…

I love max and multiply HDU - 6971(详细解答)

I love max and multiply HDU - 6971 题意&#xff1a; 数组a和b&#xff0c;现在构造一个数组c&#xff0c;使得c[k]max(a[i] * b[j]) , i&j>k 求数组c的和 题解&#xff1a; 我们可以考虑求出所有Dkmax(Ai * Bj)并满足i&jk&#xff0c;然后再从后向前取&#…

[NewLife.XCode]数据模型文件

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

[HNOI2013]数列(差分)

[HNOI2013]数列 problem 洛谷链接 solution 假设每天的股价为 a[i]a[i]a[i]。则需满足 ∀i<ka[i1]−a[i]≤m\forall_{i<k}a[i1]-a[i]\le m∀i<k​a[i1]−a[i]≤m。又有参数满足 m(k−1)<nm(k-1)<nm(k−1)<n。 也就是说每天的股价都可以取到上限&#xf…

24dian(牛客多校第三场)

24dian(牛客多校第三场) 题意&#xff1a; 给你n张牌&#xff0c;每张牌的大小为1 ~ 13&#xff0c;问这些牌与加减乘除任意组合(可以使用括号)&#xff0c;且但所有的有效解在计算过程中都涉及到分数&#xff0c;即非整数&#xff0c;能否组成答案m&#xff0c;如果可以&…

[NewLife.XCode]高级增删改

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

[AtCoder Grand Contest 048] D - Pocky Game(区间dp + 博弈)

problem AtCoder solution 注意&#xff1a;本题不是平等博弈&#xff0c;因为先手只能取最左边&#xff0c;后手只能取最右边。 设 f[l][r][k]:f[l][r][k]:f[l][r][k]: 只剩下区间 [l,r][l,r][l,r] 等待操作&#xff0c;第 lll 堆石子数量为 kkk 的时候&#xff0c;先手是…