AT2062

前言

CMLL02_AK_DSPOLY.jpg

思路

考虑把“不能”的关系对应上图的一条有向边,我们怎么做。

不妨记 fk 表示从图中选出 k 条边的可行方案数。

那么我们由子集反演,立刻得到:

Ans=k(1)k(nk)!fk

于是我们要做的是快速统计 f

仔细观察这张图中哪些边会冲突

显然就是起点或终点相同的边

由于这张图是由许多链组成的,考察每一条链状结构;具体地,形如:

abcdz

这样的链不能取相邻项,且除此之外的链均与此链无冲突关系。

记链上有 p 个顶点,那就是统计对于每种边数,链上有几种取法。

显然这就是所谓无标号 SEQ 构造的形式,不难得其为:

[up]11uzu2=(1+1+4z2)p+1(11+4z2)p+11+4z

对每条这样的链都做一遍,然后暴力乘起来就好了。

顺带提一句,其实 924844033 也是 NTT 模数。

Code

n 较小,采取了暴力多项式。

以下放核心代码。

using namespace BF_POLY;
poly Pow(poly base,uint index,uint prec)
{
base.chg_siz(prec);
poly ans(modvec{1});
while(index)
{
if(index&1)ans*=base,ans.chg_siz(prec);
base*=base,base.chg_siz(prec);index>>=1;
}
return ans;
}
int main()
{
AnyMod::ChgMod(924844033);
uint n,k;scanf("%u%u",&n,&k);
poly User({1,4});
User=User.sqrt(n+2);
poly Inv=User.inv(n+2);
poly QAQ(modvec{1});
for(uint i=0;i<k;i++)
{
uint p=(n-i-1)/k+1;
poly P=
(Pow((modint(1)+User)*modint(2).inv(),p+1,p+1)-
Pow((modint(1)-User)*modint(2).inv(),p+1,p+1))
*cpd().chg_siz(Inv,p+1);
P.chg_siz(p+1);
QAQ*=P*P;
}
modint ans=0,v(1);
for(uint i=n;~i;i--)
{
ans+=(i&1?AnyMod::Mod-1:1)*v*QAQ.val(i);
v*=n-i+1;
}
ans.println();
return 0;
}
posted @   myee  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
点击右上角即可分享
微信分享提示