JZOJ5787 轨道
题目大意
给出 n,m。
需要构造一个长度为 n 的正整数序列 A,其中 Ai∈[1,m]。
给出一个正整数 K。你的序列需要使的存在一个正整数 V,使得 V⋅K=∏Ai 且 V 与 K 互质。
求出构造方案数。
其中 n≤30001,m≤109,K≤107。
解题思路
考虑 DP
设 dp(i,j) 表示构造到 i 位,使得 ∏Ai=j 的方案数。
这样显然开不下,但是发现其实我们只关心 gcd(j,K)。
显然 gcd(j,K) 是 K 的因数,我们将因数全部预处理出来,从小到大排列,记为数列 a,这不会太多,数量 at≤1000。
同时记 mp(i) 表示 i 在 K 的因数中的排名。
所以我们将 dp(i,j) 含义改成:构造到 i 位,使得 gcd(∏Ai,K)=a[j] 的方案数。
那么我们可以推出状态转移方程:
dp(i,j)=∑a(k)|a(j)dp(i−1,k)⋅dp(1,mp(a(j)a(k)))
考虑如何实现转移,我们可以预处理出 a(j) 的所有因数,这将耗费 O(at2)≤106 的时间。
经过预处理,转移的总时间消耗为 O(n∑σ0(a(i)))≤2∗104n≤6∗108,实际上这个数字会更加的小,其中 σ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)]。
即求 y 与 K 互质的个数,使用容斥原理。
即1 的倍数,减去 2 的倍数,减去 3 的倍数,加上 6 的倍数等等,的小学问题。
更具体的其容斥系数即为莫比乌斯函数 μ,不难理解。
更严谨的,使用莫比乌斯反演:
f(i)=N∑j[gcd(j,K)=i]F(i)=∑i|jf(j)=N∑j[i|gcd(j,K)]=⌊Ni⌋
其中要求 i|K。
根据莫比乌斯反演,所求 f(1) 即为:
f(1)=∑i|Kμ(i)F(i)
线性筛出莫比乌斯函数 O(K)≤107,预处理 O(at2)≤106。
至此,我们解决了这个问题。
参考代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现