第一眼,Burnside 直接丢上去啊。

设 \(f(n,m)\) 是有 \(n-m\) 个白色珠子和 \(m\) 个白色珠子的满足题意的环的个数,容易得到答案是:

\[\sum_{d|n,d|m}f(\frac{n}{d},\frac{m}{d})\varphi(d)
\]

考虑左边这个 \(f\) 怎么做。

我们将环断开,枚举前缀和后缀的黑色珠子个数,有:

\[f(n,m)=\sum_{x+y\leq k,x+y+2\leq n}g(n-x-y-1,m-x-y)=\sum_{i=0}^{\min(k,n-2)}(i+1)\times g(n-i-1,m-i)
\]

其中 \(g(n,m)\) 为不存在超过 \(k\) 个连续黑色珠子的序列个数,且序列的最后一个元素是白色的。

我们似乎可以接受单次 \(O(n\log n)\) 计算 \(f\) 的算法。

考虑上生成函数。我们强制钦定每一段黑珠子后面跟上一个白珠子(包括 \(0\) 个白珠子),那么一段的 OGF 就是 \(\sum_{i=0}^{k}x^i=\frac{1-x^{k+1}}{1-x}\)。

\(g\) 的单点就是 \(g(n,m)=[x^m](\frac{1-x^{k+1}}{1-x})^{n-m}\)。

写开:

\[g(n,m)=[x^m]\frac{1}{(1-x)^{n-m}}\times(1-x^{k+1})^{n-m}
\]
\[[x^m](\sum \binom{i+n-m-1}{i})\times(\sum_{i=0}^{n-m}\binom{n-m}{i}x^{(n-m)(k+1)})
\]

注意到你在单次处理时,这个 \(n-m\) 是一直不会变的。变的是多项式取哪一项。

直接把这两个东西写开,卷一下就好了。

我们再观察一下:

设 \(F(x)=\frac{1-x^{k+1}}{1-x}\)。

\[[x^m]\sum_{i=0}^k(i+1)x^iF^{n-m-1}(x)
\]
\[[x^m](xF'(x)+F(x))F^{n-m-1}(x)
\]
\[[x^m]xF'(x)F^{n-m-1}(x)+F^{n-m}(x)
\]
\[([x^{m-1}]F'(x)F^{n-m-1}(x))+([x^m]F^{n-m}(x))
\]
\[(\frac{1}{n-m}[x^{m-1}](F^{n-m}(x))')+([x^m]F^{n-m}(x))
\]
\[(\frac{m}{n-m}[x^m]F^{n-m}(x)))+([x^m]F^{n-m}(x))
\]
\[\frac{n}{n-m}[x^m]F^{n-m}(x)
\]

右边简单。

\[[x^m]\frac{(1-x^{k+1})^{n-m}}{(1-x)^{n-m}}
\]
\[[x^m](\sum_{i=0}\binom{i+n-m-1}{i}x^i)(\sum_{i=0}^{n-m}\binom{n-m}{i}(-1)^{i}x^{i(k+1)})
\]
\[\sum_{i=0}^{n-m}\binom{n-m}{i}(-1)^i\binom{m-i(k+1)+n-m-1}{n-m-1}
\]

然后就能够线性求单点的 \(f\) 了。

#include<cstdio>
const int M=1e5+5,mod=998244353;
int n,m,k,fac[M],ifac[M];
inline int pow(int a,int b){
int ans(1);for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;return ans;
}
inline int C(const int&n,const int&m){
return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
inline int phi(int n){
int ans(1);
for(int i=2;i<=n;++i)if(!(n%i)){
ans*=i-1;n/=i;while(!(n%i))ans*=i,n/=i;
}
return ans;
}
inline int f(const int&n,const int&m){
int ans(0);
for(int i=0;i<=n-m;++i){
if(m-i*(k+1)<0)break;
if(i&1)ans=(ans+1ll*(mod-C(n-m,i))*C(m-i*(k+1)+n-m-1,n-m-1))%mod;
else ans=(ans+1ll*C(n-m,i)*C(m-i*(k+1)+n-m-1,n-m-1))%mod;
}
return 1ll*n*pow(n-m,mod-2)%mod*ans%mod;
}
signed main(){
int ans(0);
scanf("%d%d%d",&n,&m,&k);
if(n==m)return printf("%d",m<=k),0;
fac[0]=fac[1]=ifac[0]=ifac[1]=1;
for(int i=2;i<=n;++i)fac[i]=1ll*fac[i-1]*i%mod,ifac[i]=1ll*(mod-mod/i)*ifac[mod%i]%mod;
for(int i=2;i<=n;++i)ifac[i]=1ll*ifac[i-1]*ifac[i]%mod;
for(int i=1;i<=n;++i)if(!(n%i)&&!(m%i))ans=(ans+1ll*f(n/i,m/i)*phi(i))%mod;
printf("%d",1ll*ans*pow(n,mod-2)%mod);
}

LGP4916题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. MySQL数据类型的最优选择

    MySQL数据类型的最优选择   慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下:            ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下)      ● 计算.进而 ...

  2. FastJSON解析Json字符串(反序列化为List、Map)

    在日常开发与数据库打交道的时候,常有以Json格式的字符串存储到数据库的情况,当在Java程序中获取到对应的Json格式的String字符串后,如何才能转换为我们想要的数据格式(比如转换成Java中的 ...

  3. python基础——异常处理、递归

    异常处理 while True: try: num1 = int(input('num1:')) num2 = int(input('num2:')) result = num1 + num2 exc ...

  4. 浅谈Java面向对象之抽象类(abstract)

    java语言,声明类时格式为: abstract class Db{} 说明Db类为抽象类.抽象方法是说没有方法的实现(方法体)此方法为抽象方法,只有抽象类和接口中才可以有抽象方法.简而言之,含有抽象 ...

  5. Java经典案例之用三种方法求1~100以内素数之和

    素数,不能被除了1和本身以外整除的数被称为素数.接下来我用三种方式求得1~100以内素数. 方式一 外层每循环一次,内层就计算出这个数有几个因子,我们都知道素数的因子只有两个,所以如果个数为2就加进总 ...

  6. nginx负载均衡中常见的算法及原理有哪些?

    一.nginx负载均衡常用算法 1.1 轮询 轮询,nginx默认方式.一次将请求分配给各个后台服务器. upstream backserver { server 10.0.0.7; server 1 ...

  7. 虫师Selenium2+Python_5、自动化测试模型

    P138--模块化驱动测试实例 P142--参数化搜索关键字 from selenium import webdriver search_text = ['python','中文','text'] # ...

  8. Kubernetes 集群日志 和 EFK 架构日志方案

    目录 第一部分:Kubernetes 日志 Kubernetes Logging 是如何工作的 Kubernetes Pod 日志存储位置 Kubelet Logs Kubernetes 容器日志格式 ...

  9. swoole错误“Uncaught Error: Class 'swoole_server' not found”的解决办法

    如果你在执行swoole对应文件时,报下面的错误, PHP Fatal error: Uncaught Error: Class 'swoole_server' not found in /mnt/w ...

  10. Failed to restart ssh.service: Unit not found.

    环境 操作系统:CentOS 7 问题 重启ssh服务,启动报错:Failed to restart ssh.service: Unit not found. 操作步骤 1. 编辑sshd_confi ...