题目链接

https://www.luogu.org/problem/P4708

题解

看上去Luogu P4706-4709是Sdchr神仙出的一场比赛,一道水题和三道很有趣的题终于全过了纪念QAQ(然而后三道都看了题解)

以及为啥这题AC代码几乎全是打表。。

前置题目: BZOJ1488 求\(n\)个点无标号无向图个数。(欢迎阅读 https://www.cnblogs.com/suncongbo/p/11295453.html )

没做过的建议先去做一下那题。

这道题依然是枚举拆分数,然后现在的问题就是给定一些长度的轮换求有多少个点度均为偶数的图满足经过这些轮换作用后依然不变。

首先一个性质是,同一轮换内的所有点度数相同。(显然)

考虑轮换内部的边,假设这个轮换长度为\(L=2s+1\), 那么则有\(s\)种不同的边组,每一种边组会使得轮换内所有点度数\(+2\); 若轮换长度为\(2s\), 则有\(s\)种不同的边组,其中\((s-1)\)种(除了对角的之外)使得所有点度数\(+2\), \(1\)种使得所有点度数\(+1\). 度数\(+2\)不改变奇偶性的显然可以不考虑,直接答案乘以\(2\).

再考虑轮换之间的边,假设两轮换长度分别为\(a,b\)则有\(\gcd(a,b)\)种边组,每种边组内包含\(\text{lcm}(a,b)\)条边,会给\(a\)中的点度数\(+\frac{\text{lcm}(a,b)}{a}\),给\(b\)中的点度数\(+\frac{\text{lcm(a,b)}}{b}\). 若二者都为偶数,答案乘以\(2^{\gcd(a,b)}\). 若二者中恰有一个为奇数,则相当于有\(\gcd(a,b)\)次机会给奇数的那个轮换改变奇偶性。若二者都是奇数,则相当于有\(\gcd(a,b)\)次机会给两个轮换同时改变奇偶性。

于是问题转化为: 有一张新图(新图里的点代表一个轮换),初始点权都为\(0\), 对每个点有\(c_i\)次机会改变它的奇偶性,对每条边有\(d_i\)次机会同时改变两端点的奇偶性。求有多少种方案使得最终所有点的点权为\(0\).

这个结论是,对于每一种改变点权总次数为偶数次的方案,都存在\(2^{\sum d_i-cnt+1}\)种边操作方案(\(cnt\)为点数)与之对应。

感性理解,改变点权如果是奇数次显然不行,偶数次的话可以构建一棵DFS树,非树边任意操作之后树边按照自下而上操作总能操作完。

注意这里官方题解写的是错的!官方题解直接写成\(2^{\sum d_i}\)坑了我一晚上……

那么答案就是\(2^{\sum c_i-1}\times 2^{\sum d_i-cnt+1}\).

问题解决。

时间复杂度同BZOJ 1488.

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std; inline int read()
{
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return -x;
} const int N = 50;
const int P = 998244353;
llong fact[N*N*N+3],finv[N*N*N+3],inv[N*N*N+3],pw2[N*N*N+3];
int gcd[N+3][N+3]; int GCD(int x,int y) {return y==0 ? x : GCD(y,x%y);} llong quickpow(llong x,llong y)
{
llong cur = x,ret = 1ll;
for(int i=0; y; i++)
{
if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}
cur = cur*cur%P;
}
return ret;
} void initmath(int n)
{
fact[0] = 1ll; for(int i=1; i<=n; i++) fact[i] = fact[i-1]*i%P;
finv[n] = quickpow(fact[n],P-2); for(int i=n-1; i>=0; i--) finv[i] = finv[i+1]*(i+1)%P;
for(int i=1; i<=n; i++) inv[i] = finv[i]*fact[i-1]%P;
pw2[0] = 1ll; for(int i=1; i<=n; i++) pw2[i] = pw2[i-1]*2ll%P;
} int a[N+3],num[N+3];
int uf[N+3];
int c[N+3];
int n,cnt; llong ans; int findfa(int u)
{
int i = u;
while(u!=uf[u]) {u = uf[u];}
while(u!=uf[i])
{
int j = uf[i]; uf[i] = u; i = j;
}
return u;
} void unionfa(int u,int v)
{
int x = findfa(u),y = findfa(v);
if(x!=y) {uf[x] = y;}
} llong calc()
{
for(int i=1; i<=cnt; i++) uf[i] = i,c[i] = 0;
llong ret = fact[n];
for(int i=1; i<=cnt; i++) {ret = ret*inv[a[i]]%P;}
for(int i=1; i<=n; i++) {ret = ret*finv[num[i]]%P;}
llong retp = 0ll;
for(int i=1; i<=cnt; i++)
{
for(int j=i+1; j<=cnt; j++)
{
int g = gcd[a[i]][a[j]],lcm = a[i]*a[j]/g;
int ci = lcm/a[i],cj = lcm/a[j];
if((ci&1)==(cj&1))
{
retp += g;
if(ci&1) {unionfa(i,j);}
}
}
}
for(int i=1; i<=cnt; i++)
{
for(int j=i+1; j<=cnt; j++)
{
int g = gcd[a[i]][a[j]],lcm = a[i]*a[j]/g;
int ci = lcm/a[i],cj = lcm/a[j];
int x = findfa(i),y = findfa(j);
if((ci&1)!=(cj&1))
{
if(ci&1) {c[x]+=g;}
else if(cj&1) {c[y]+=g;}
}
}
}
for(int i=1; i<=cnt; i++)
{
int x = findfa(i);
retp += ((a[i]-1)>>1);
if(!(a[i]&1)) {c[x]++;}
}
retp -= cnt;
for(int i=1; i<=cnt; i++) {if(uf[i]==i) retp++;}
for(int i=1; i<=cnt; i++)
{
if(uf[i]==i && c[i]>0)
{
retp += c[i]-1;
}
}
ret = ret*pw2[retp]%P;
return ret;
} void dfs(int sum)
{
if(sum==0)
{
ans = (ans+calc())%P;
}
for(int i=a[cnt]; i<=sum; i++)
{
cnt++; a[cnt] = i; num[i]++;
dfs(sum-i);
num[i]--; a[cnt] = 0; cnt--;
}
} int main()
{
initmath(N*N*N);
for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) gcd[i][j] = GCD(i,j);
scanf("%d",&n);
a[0] = 1; dfs(n);
ans = ans*finv[n]%P;
printf("%lld\n",ans);
return 0;
}

Luogu P4708 画画 (Burnside引理、组合计数)的更多相关文章

  1. 【等价的穿越】Burnside引理&Pólya计数法

    Problem 起源: SGU 294 He's Circle 遗憾的是,被吃了. Poj有道类似的: Mission 一个长度为n(1≤n≤24)的环由0,1,2组成,求有多少本质不同的环. 实际上 ...

  2. BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的 ...

  3. Luogu P5564 [Celeste-B]Say Goodbye (多项式、FFT、Burnside引理、组合计数)

    题目链接 https://www.luogu.org/problem/P5564 题解 这题最重要的一步是读明白题. 为了方便起见下面设环长可以是\(1\), 最后统计答案时去掉即可. 实际上就相当于 ...

  4. BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)

    题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...

  5. 洛谷 P4708 - 画画(Burnside 引理+组合数学)

    洛谷题面传送门 神仙题 %%%%%%%%%%%%%%%%%%%% 题解搬运人来了 首先看到本质不同(无标号)的图计数咱们可以想到 Burnside 引理,具体来说,我们枚举一个排列 \(p\),并统计 ...

  6. 洛谷 P4708 画画(无标号欧拉子图计数)

    首先还是类似于无标号无向图计数那样,考虑点的置换带动边的置换,一定构成单射,根据 Burnside 引理: \[|X / G| = \frac{1}{|G|}\sum\limits_{g \in G} ...

  7. 【loj6538】烷基计数 加强版 加强版 Burnside引理+多项式牛顿迭代

    别问我为啥突然刷了道OI题,也别问我为啥花括号不换行了... 题目描述 求含 $n$ 个碳原子的本质不同的烷基数目模 $998244353$ 的结果.$1\le n\le 10^5$ . 题解 Bur ...

  8. 等价类计数:Burnside引理 & Polya定理

    提示: 本文并非严谨的数学分析,有很多地方是自己瞎口胡的,仅供参考.有错误请不吝指出 :p 1. 群 1.1 群的概念 群 \((S,\circ)\) 是一个元素集合 \(S\) 和一种二元运算 $ ...

  9. 等价类计数(Polya定理/Burnside引理)学习笔记

    参考:刘汝佳<算法竞赛入门经典训练指南> 感觉是非常远古的东西了,几乎从来没有看到过需要用这个的题,还是学一发以防翻车. 置换:排列的一一映射.置换乘法相当于函数复合.满足结合律,不满足交 ...

随机推荐

  1. SqlServer中#和##的区别

    本地临时表的名称以单个数字字符(#)开头,它们仅对当前的用户连接是可见的. 全局临时表的名称以两个数字字符(##)开头,创建后对任何用户都是可见的.

  2. mybatis-sql执行流程源码分析

    1. SqlSessionFactory 与 SqlSession. 通过前面的章节对于mybatis 的介绍及使用,大家都能体会到SqlSession的重要性了吧, 没错,从表面上来看,咱们都是通过 ...

  3. Hive 教程(五)-参数配置

    配置基本操作 hive> set; 查看所有配置hive> set key: 查看某个配置hive> set key value: 设置某个配置 我们可以看到一些 hadoop 的配 ...

  4. uboot 主Makefile 分析。

    本文以uboot_1.1.6 对应的CPU是S3C2440 为例 uboot_1.1.6 根目录下的主Makefile开头: VERSION = PATCHLEVEL = SUBLEVEL = EXT ...

  5. Zookeeper报错Will not attempt to authenticate using SASL解决办法

      版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq642159746/article/ ...

  6. O004、启动第一个KVM虚机

    参考https://www.cnblogs.com/CloudMan6/p/5249270.html   本节演示如何使用 virt-manager 启动 KVM 虚机,   提前下载一个 cirro ...

  7. springboot(十八)-session共享

    前言 在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是在分布式/集群项目中,Session 共享则是一个必须面对的问题,先看一个简单的架构图: 在这样的架构中 ...

  8. HDFS NFS Gateway

    NFS网关支持NFSv3,并允许将HDFS作为客户端本地文件系统进行挂载.目前,NFS Gateway支持并启用以下使用模式: 用户可以通过NFSv3客户端兼容操作系统上的本地文件系统浏览HDFS文件 ...

  9. 好用的 python 工具集合

    图标处理小程序, 妈妈再也不用担心我不会制作图标了 # PythonMargick包可以到Unofficial Windows Binaries for Python Extension Packag ...

  10. HTTPS中CA证书的签发及使用过程

    1,HTTPS 简单来讲,HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议就是安全的HTTP,我们知道HTTP是运行在TCP层之上的,HTTPS在 ...