JZOJ5787 轨道

JZOJ5787 轨道

题目大意

给出 nm

需要构造一个长度为 n 的正整数序列 A,其中 Ai[1,m]

给出一个正整数 K。你的序列需要使的存在一个正整数 V,使得 VK=AiVK 互质。

求出构造方案数。

其中 n30001,m109,K107

解题思路

考虑 DPdp(i,j) 表示构造到 i 位,使得 Ai=j 的方案数。

这样显然开不下,但是发现其实我们只关心 gcd(j,K)

显然 gcd(j,K)K 的因数,我们将因数全部预处理出来,从小到大排列,记为数列 a,这不会太多,数量 at1000

同时记 mp(i) 表示 iK 的因数中的排名。

所以我们将 dp(i,j) 含义改成:构造到 i 位,使得 gcd(Ai,K)=a[j] 的方案数。

那么我们可以推出状态转移方程:

dp(i,j)=a(k)|a(j)dp(i1,k)dp(1,mp(a(j)a(k)))

考虑如何实现转移,我们可以预处理出 a(j) 的所有因数,这将耗费 O(at2)106 的时间。

经过预处理,转移的总时间消耗为 O(nσ0(a(i)))2104n6108,实际上这个数字会更加的小,其中 σ0 表示因数个数。

我们解决了转移问题,接下来考虑如何求出 dp(1,j)

考虑其含义,即数 x[1,m] 使得 gcd(x,K)=a(j) 并且 gcd(xa(j),K)=1 的个数。

直接枚举不可行,考虑进行一步转化,第二个条件等价于:

gcd(xa(j),Ka(j))=1

第三个条件可以推出条件二,故关键在于条件三。

gcd(xa(j),K)=1

y[1,ma(j)]

即求 yK 互质的个数,使用容斥原理。

1 的倍数,减去 2 的倍数,减去 3 的倍数,加上 6 的倍数等等,的小学问题。

更具体的其容斥系数即为莫比乌斯函数 μ,不难理解。

更严谨的,使用莫比乌斯反演:

f(i)=jN[gcd(j,K)=i]F(i)=i|jf(j)=jN[i|gcd(j,K)]=Ni

其中要求 i|K

根据莫比乌斯反演,所求 f(1) 即为:

f(1)=i|Kμ(i)F(i)

线性筛出莫比乌斯函数 O(K)107,预处理 O(at2)106

至此,我们解决了这个问题。

参考代码

posted @   DeepSeaSpray  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示