Hdu 4732

题目链接:: http://acm.hdu.edu.cn/showproblem.php?pid=4732
代码链接:: https://github.com/Ronnoc/Training/blob/master/Hdu/4732.cpp
Round Table
N个点成环,选择M个点,最长连续选取长度要小于K.

(1<=M<=N<=10^5,2<=K<=10^5)
在旋转同构的意义下种数有多少

解:

选取的点称为黑点

不选取的点称为白点

对白点无约束

黑点有M个,白点就有N-M个,特判掉N==M的情况

记n=N-M

对每个白点,以它为起点展开,记第i个起点后黑点的个数为x[i]

则可以转化为x[1]+...+x[n]=M且0<=x[i]<K在旋转同构下的种数

先不考虑旋转同构

我们可以采用容斥原理的办法得到不考虑同构时的结果为Z=∑Comb(n,i)*(-1)^i*z[i]

其中z[j]表示x[1]+...+x[n]=M,x[i]非负且有j个数>=K的种数

以n=8,M=4,K很大为例

在Z中和40000000同构的出现了8次

和11001100同构的出现了4次

和10101010同构的只出现了2次

我们接下来要做的事情就是去重

记g(u)表示以长度u为循环节的种数

记f(u)表示以长度u为最小循环节的种数

有g(u)=∑_{d|u}f(d)

由mobius反演公式可得f(u)=∑_{d|u}\miu[d]*g(u/d)

真正要求的答案是Ans=∑f(i)/i

我们带入并采用一些手段化简公式可以得到

Ans=∑_{u|gcd(n,M)}∑_{d|n/u}\miu[n/(ud)]*g(d)*u/n

这部分可以做的很快了,但是具体的复杂度我也没有花时间去算...


//感谢叉姐告诉,b的我循环节的事情...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值