UOJ426. 【集训队作业2018】石像 [状压DP,min_25筛]

本文探讨了使用min_25筛法解决UOJ题目中的复杂数学问题,通过解析函数f(n)=(σ0(n^3))^3,利用手玩得到特定公式,进而通过状态压缩DP算法高效求解。文章分享了一种新颖的拓扑序转移方法,并最终通过二项式反演得出答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UOJ

思路

(以下思路是口胡,但正确性大概没有问题。)

刚学min_25筛的时候被麦老大劝来做这题?

结果发现这题是个垃圾二合一??

简单推一下式子可以得到答案就是这个:
\[ \sum_{T=1}^m (f*\mu)(T)\sum_{\{a_i\le m/T \}} \prod_i [a_{x_i}\le a_{y_i}] \]
其中\(f(n)=(\sigma_0(n^3))^3\)

通过手玩可以得到\((f*\mu)(p^c)=81c^2-27c+9,c\ne 0\),于是可以min_25求前缀和。

现在问题转化为:对于一个给定的上界,求满足限制的\(\{a_n\}\)有几个。

先缩点。考虑枚举\(\{a_n\}\)中不同的\(a\)有几个,然后状压DP:设\(f_S\)表示从小到大放,当前已经放了\(S\)的方案数。我们做\(n\)次转移,做完\(i\)次之后\(f_U\)就是至多\(i\)个不同的\(a\)的方案数。

转移可以枚举子集,但显然会TLE。考虑一个点能被放上去当且仅当小于它的全都放上去了,于是有一个根据拓扑序转移的方法:

f[0]=1;
rep(i,1,n)
{
    repd(j,n,1)
    {
        int s=((1<<n)-1)^mp[j]^(1<<j-1);
        for(int k=s; ; k=(k-1)&s)
        {
            f[k^mp[j]^(1<<j-1)]+=f[k^mp[j]];
            if(!k) break;
        }
    }
    cur[i]=f[(1<<n)-1];
}

(麦老大nb!)

其中\(n\)的拓扑序最大,\(mp_j\)记录\(j\)直接连向的点。

最后对\(cur\)二项式反演一下就没了。

代码

咕咕咕

转载于:https://www.cnblogs.com/p-b-p-b/p/11616439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值