loj6519 魔力环
解题思路
考虑顺时针旋转 \(i\) 步得到的结果,根据Burnside引理,有
\]
\(C(i)\) 为旋转 \(i\) 步时不动点的数量。
实际上,旋转 \(i\) 步得到的是 \(\frac{n}{\gcd(n,i)}\) 个互不相干的环,每个环都是一个置换。不难发现,若一个方案在旋转 \(i\) 步的情况下为不动点,那么对于分割出来的每个小环,要么都为黑色,要么都为白色。
可以得到,对于 \(\gcd(n,i)\) 相等的 \(i\) ,它们对答案的贡献是一样的。
所以可以枚举每个小环的长度 \(l\) 。不难发现 \(l\) 需要是 \(n\) 的因数。而由于每个小环要么全黑,要么全白,所以黑点数量应当为 \(l\) 的整数倍。即 \(l|\gcd(n,m)\) 。
所以答案可以写成这样:
\]
用到了使用Burnside的时候常用的东西:
\]
接下来就要解决如何求 \(f(l)\) 。可以这样考虑:
对于环长 \(l\) , \(n\) 个点被分成了 \(\frac{n}{l}\) 个环。不妨将每个点以其所在的点标号,那么就会产生类似于 \(1,2,3,1,2,3\) 这样的重复。也就是说,还可以将“ \(1,2,3\) ”看成 \(1\) 个环,总共 \(l\) 个环,每个环 \(\frac{n}{l}\) 个点。为了方便叙述,不妨将其称为“第二种环”。
每个“第二种环”恰好有“第一种环”上每个环里一个点,也就是说,恰好有 \(\frac{m}{l}\) 个黑点。即需要在一个 \(\frac{n}{l}\) 元环上选 \(\frac{m}{l}\) 个黑点,其中连续的黑点不超过 \(k\) 个。注意这里的环相当于有了标号,旋转相同的不算重复。
可以考虑断环成链,然后枚举链首尾连续的黑点个数之和 \(j\) 。如果记 \(x\) 个黑点分成 \(y\) 份,每份可以为空的方案数为 \(F(x,y)\) ,那么环上的答案就是:
\]
而 \(F\) 的值可以通过容斥得到
\]
计算 \(F(x,y)\) 的时间复杂度是 \(O(\frac{x}{k})\) 的,计算 \(f(l)\) 的时间复杂度是 \(O(\frac{n}{l})\) 的。所以总的时间复杂度是 \(O(n)\) 的。
参考程序
#include <cstdio>
#define Maxn 100010
#define Mod 998244353
int Fact[Maxn], Inv[Maxn], Phi[Maxn], Vis[Maxn], Prime[Maxn], n, m, k;
inline void Pre();
inline int f(int x);
inline int F(int x, int y);
#define Add(x,y) ((x)+(y))%Mod
#define Dec(x,y) (x)>(y)?(x)-(y):(x)-(y)+Mod
#define Mul(x,y) 1ll*(x)*(y)%Mod
inline int Pow(int x,int y){int A=1;for(;y;y>>=1,x=Mul(x,x))if(y&1)A=Mul(A,x);return A;}
#define C(x,y) 1LL*Fact[x]*Inv[y]%Mod*Inv[(x)-(y)]%Mod
int main() {
scanf("%d%d%d", &n, &m, &k);
if (k == 0) return printf("%d\n", m ? 0 : 1), 0;
if (m == 0) return printf("1\n"), 0;
Pre();
int gcd = [](int x, int y)->int{int T = x % y; while(T) x = y, y = T,T = x % y; return y; }(n, m);
int Ans = 0;
for (int i = 1; i <= gcd; ++i)
if (!(gcd % i))
Ans = Add(Ans, Mul(f(i), Phi[i]));
Ans = Mul(Ans, Pow(n, Mod - 2));
printf("%d\n", Ans);
return 0;
}
inline void Pre() {
Fact[0] = 1; for (int i = 1; i <= n; ++i) Fact[i] = Mul(Fact[i - 1], i);
Inv[n] = Pow(Fact[n], Mod - 2); for (int i = n - 1; i >= 0; --i) Inv[i] = Mul(Inv[i + 1], i + 1);
Phi[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!Vis[i]) Phi[i] = i - 1, Prime[++Prime[0]] = i;
for (int j = 1; j <= Prime[0] && 1LL * i * Prime[j] <= n; ++j) {
Vis[i * Prime[j]] = 1;
if (i % Prime[j] == 0) { Phi[i * Prime[j]] = Phi[i] * Prime[j]; break; }
Phi[i * Prime[j]] = Phi[i] * (Prime[j] - 1);
}
}
return;
}
inline int f(int l) {
if (n / l - m / l == 1) return (m / l <= k) ? m / l + 1 : 0;
int Ans = 0;
for (int j = 0; j <= k; ++j)
Ans = Add(Ans, Mul(j + 1, F(m / l - j, n / l - m / l - 1)));
return Ans;
}
inline int F(int x, int y) {
int Ans = 0;
for (int i = 0; i * (k + 1) <= x && i <= y; ++i) {
if (i & 1) Ans = Dec(Ans, Mul(C(y, i), C(x - i * (k + 1) + y - 1, y - 1)));
else Ans = Add(Ans, Mul(C(y, i), C(x - i * (k + 1) + y - 1, y - 1)));
}
return Ans;
}
loj6519 魔力环的更多相关文章
- LOJ6519. 魔力环(莫比乌斯反演+生成函数)
题目链接 https://loj.ac/problem/6519 题解 这里给出的解法基于莫比乌斯反演.可以用群论计数的相关方法代替莫比乌斯反演,但两种方法的核心部分是一样的. 环计数的常见套路就是将 ...
- Luogu4916 魔力环 莫比乌斯反演、组合、生成函数
传送门 先不考虑循环同构的限制,那么对于一个满足条件的序列,如果它的循环节长度为\(d\),那么与它同构的环在答案中就会贡献\(d\)次. 所以如果设\(f_i\)表示循环节长度恰好为\(i\)的满足 ...
- [Luogu4916]魔力环[Burnside引理、组合计数、容斥]
题意 题目链接 分析 sπo yyb 代码 #include<bits/stdc++.h> using namespace std; typedef long long LL; #defi ...
- 【Luogu4916】魔力环(Burnside引理,组合计数)
考虑\(Burside\)引理,设\(f(x)\)表示置换拆成循环的个数为\(x\)时的答案,那么最终的结果就是\(\displaystyle \frac{\sum_{i=1}^n f(gcd(i,n ...
- luogu P4916 魔力环
传送门 表示这种\(Burnside\)定理之类的东西一用就忘qwq 题目要求不同染色方案数,因为变换方式只有旋转,所以只有\(n\)个置换,然后可能会出现某种方案有循环节,这个循环节长度显然要是\( ...
- [jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)
题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 注: ...
- 【LuoguP4916】魔力环
题目链接 题意 求出 \(n\) 个珠子的在旋转同构意义下的手 环 个数,满足以下条件: 恰好有 \(m\) 个黑色珠子,其余为白色. 黑色珠子形成的最长连续段不能超过 \(k\) 个. Sol 考虑 ...
- 「MtOI2018」魔力环
首先发现是经典的循环置换本质不同个数模型,根据 Burnside 引理: \[|X / G| = \frac{1}{|G|}\sum\limits_{g \in G} |X ^ g| \] 考虑第 \ ...
- GOOD BYE OI
大米饼正式退役了,OI给我带来很多东西 我会的数学知识基本都在下面了 博客园的评论区问题如果我看到了应该是会尽力回答的... 这也是我作为一个OIer最后一次讲课的讲稿 20190731 多项式乘法 ...
随机推荐
- 5-MySQL DBA笔记-开发技巧
第5章 开发技巧 本章将介绍一些和数据库相关的开发技巧.由于开发领域很广,这里只选取部分比较常见的小技巧.5.1 存储树形数据 有时我们需要保存一些树形的数据结构,比如组织架构.话题讨论.知识管理.商 ...
- ListUtils的简单集合操作和原理
1 Maven依赖 <dependency> <groupId>org.apache.commons</groupId> <artifactId>com ...
- *4.1 所有类型都从System.Object派生
- JavaSpring【一、概述】
主要内容 JavaSpring[一.概述] JavaSpring[二.IOC] JavaSpring[三.Bean] JavaSpring[四.Bean管理注解实现] JavaSpring[五.AOP ...
- CAFFE(FAQ.2):Ubuntu 配置caffe 框架之数据库读取,错误解决:ImportError: No module named leveldb解决办法
Z: 在安装了caffe框架后需要读取大量的数据进行学习训练.比如在MNIST识别训练中,一般直接读图片会比较耗时,我们一般将图片转存为数据库中.目前主流的数据库有以下两种选择: LevelDB Lm ...
- PAT Basic 1095 解码PAT准考证 (25 分)
PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5~10 位是考试日期,格式为年.月. ...
- 团队项目-Beta版本发布
这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业要求链接 团队名称 众志陈成 这个作业的目标 通过团队协作了解软件开发的大致流程,并在这个过程中体会调整与优化程序的方法,为以后真实的软件开发奠 ...
- 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)
P2746 [USACO5.3]校园网Network of Schools https://www.luogu.org/problem/P2746 题目描述 一些学校连入一个电脑网络.那些学校已订立了 ...
- python .pth 文件 和 site 模块
python .pth 文件 和 site 模块 .pth 文件 该文件位于 python 的 /Lib/site-packages 目录下,可以有多个,在 .pth 文件中可以把其它目录添加到 sy ...
- 《wifi加密破解论文》翻译介绍-wifi不再安全
前言 wifi的加密协议WPA2已经被破解,影响范围包括所有支持wifi的设备,包括Android,Linux,Apple,Windows,OpenBSD,联发科技,Linksys等.其中对Andro ...