把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【洛谷5106】dkw的lcm(Min-Max容斥)

题目链接

  • 给定 \(n,k\),求 \(\prod_{i_1=1}^n\prod_{i_2=1}^n\cdots\prod_{i_k=1}^n\phi(\operatorname{lcm}(i_1,i_2,\cdots,i_k))\)
  • \(1\le n,k\le 10^6\)

Min-Max 容斥

首先要知道经典的 Min-Max 容斥公式:

\[\operatorname{max}(S)=\sum_{T\subseteq S}(-1)^{|T|-1}\min(T) \]

而对于 \(\operatorname{lcm}\)\(\operatorname{gcd}\),分别考虑对 每种质因子的次数 做 Min-Max 容斥,于是得到:

\[\operatorname{lcm}(S)=\prod_{T\subseteq S}\gcd(T)^{(-1)^{|T|-1}} \]

发现给这里的 \(\operatorname{lcm}\)\(\operatorname{gcd}\) 外面套上个 \(\phi\) 后依然成立,也就是说:

\[\phi(\operatorname{lcm}(S))=\prod_{T\subseteq S}\phi(\gcd(T))^{(-1)^{|T|-1}} \]

推式子

把上述容斥式子代回原式,得到:

\[\prod_{i_1=1}^n\prod_{i_2=1}^n\cdots\prod_{i_k=1}^n\prod_{T\subseteq \{i_1,i_2,\cdots,i_k\}}\phi(\gcd(T))^{(-1)^{|T|-1}} \]

考虑去枚举 \(T\),也就是枚举 \(w=|T|\),然后按顺序枚举 \(T\) 中的每个元素。则这样一个 \(T\) 将会被计算 \(C_k^wn^{k-w}\) 次,也就是说原式等于:

\[\prod_{w=1}^k\prod_{i_1=1}^n\prod_{i_2=1}^n\cdots\prod_{i_w=1}^n(\phi(\gcd(i_1,i_2,\cdots,i_w))^{(-1)^{w-1}})^{C_k^wn^{k-w}} \]

稍微调整一下括号:

\[\prod_{w=1}^k(\prod_{i_1=1}^n\prod_{i_2=1}^n\cdots\prod_{i_w=1}^n\phi(\gcd(i_1,i_2,\cdots,i_w)))^{(-1)^{w-1}C_k^wn^{k-w}} \]

然后先考虑计算括号内的内容:

\[\prod_{i_1=1}^n\prod_{i_2=1}^n\cdots\prod_{i_w=1}^n\phi(\gcd(i_1,i_2,\cdots,i_w)) \]

枚举 \(\operatorname{gcd}\) 得到:

\[\prod_{d=1}^n\phi(d)^{\sum_{i_1=1}^{\lfloor\frac nd\rfloor}\sum_{i_2=1}^{\lfloor\frac nd\rfloor}\cdots\sum_{i_w=1}^{\lfloor\frac nd\rfloor}[\gcd(i_1,i_2,\cdots,i_w)=1]} \]

这堆 \(\sum\) 是一个非常经典的莫比乌斯反演式子,可以得到:

\[\prod_{d=1}^n\phi(d)^{\sum_{p=1}^{\lfloor\frac nd\rfloor}\mu(p)(\lfloor\frac n{dp}\rfloor)^w} \]

代回原式就有:

\[\prod_{w=1}^k(\prod_{d=1}^n\phi(d)^{\sum_{p=1}^{\lfloor\frac nd\rfloor}\mu(p)(\lfloor\frac n{dp}\rfloor)^w})^{(-1)^{w-1}C_k^wn^{k-w}} \]

再调整一下枚举顺序,把 \(w\) 拎上去:

\[\prod_{d=1}^n\phi(d)^{\sum_{p=1}^{\lfloor\frac nd\rfloor}\mu(p)\sum_{w=1}^k(\lfloor\frac n{dp}\rfloor)^w(-1)^{w-1}C_k^wn^{k-w}} \]

\(g(x)=\sum_{w=1}^k(\lfloor\frac nx\rfloor)^w(-1)^{w-1}C_k^wn^{k-w}\),考虑把它调成二项式定理的形式:

\[g(x)=-\sum_{w=1}^kC_k^w(-\lfloor\frac nx\rfloor)^wn^{k-w} \]

补上 \(w=0\) 的项,就可以得到:

\[g(x)=n^k-(n-\lfloor\frac nx\rfloor)^k \]

最后代回原式:

\[\prod_{d=1}^n\phi(d)^{\sum_{p=1}^{\lfloor\frac nd\rfloor}\mu(p)\cdot g(dp)} \]

注意到 \(g(x)\) 中用到的是 \(\lfloor\frac nx\rfloor\),因此此时已经可以直接用除法分块去求了,但这样的复杂度是 \(O(n\sqrt n)\) 的。

考虑令 \(D=dp\),式子就被化成了:

\[\prod_{D=1}(\prod_{d|D}\phi(d)^{\mu(\frac Dd)})^{g(D)} \]

\(f(D)=\prod_{d|D}\phi(d)^{\mu(\frac Dd)}\),这可以枚举 \(d\) 再枚举倍数 \(D\) 求出,这样的复杂度是 \(O(n\ln n)\) 的,足以通过本题。

代码:\(O(n\ln n)\)

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Rg register
#define RI Rg int
#define Cn const
#define CI Cn int&
#define I inline
#define W while
#define N 1000000
#define X 1000000007
using namespace std;
int n,k;I int QP(RI x,RI y,CI p) {RI t=1;W(y) y&1&&(t=1LL*t*x%p),x=1LL*x*x%p,y>>=1;return t;}
int Pt,P[N+5],f[N+5],mu[N+5],phi[N+5];I void Sieve()//线性筛莫比乌斯函数和欧拉函数
{
	RI i,j;for(mu[1]=phi[1]=1,i=2;i<=n;++i) for(!P[i]&&(mu[P[++Pt]=i]=-1,phi[i]=i-1),j=1;i*P[j]<=n;++j)
		if(P[i*P[j]]=1,i%P[j]) mu[i*P[j]]=-mu[i],phi[i*P[j]]=phi[i]*(P[j]-1);else {phi[i*P[j]]=phi[i]*P[j];break;}
}
int main()
{
	RI i,j,v1,v2;for(scanf("%d%d",&n,&k),Sieve(),i=1;i<=n;++i) f[i]=1;
	for(i=1;i<=n;++i) for(v1=phi[i],v2=QP(phi[i],X-2,X),j=1;i*j<=n;++j) mu[j]&&(f[i*j]=1LL*f[i*j]*(~mu[j]?v1:v2)%X);//预处理f
	RI t=1;for(i=1;i<=n;++i) t=1LL*t*QP(f[i],(QP(n,k,X-1)-QP(n-n/i,k,X-1)+X-1)%(X-1),X)%X;return printf("%d\n",t),0;//计算答案
}
posted @ 2021-12-28 20:22  TheLostWeak  阅读(158)  评论(0编辑  收藏  举报