P5518 [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题
木xx木大
·
·
题解
P5518 [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题
基础练习题都是毒瘤阴间题!
写这题之前我从来没想过莫反题码量能有 4k 。。。
type=0:
\prod_{i=1}^{A}\prod_{j=1}^{B}\prod_{k=1}^C{\left(\frac{ij}{\gcd(i,j)\gcd(i,k)}\right)}\\=(A!)^{BC}(B!)^{AC}\prod_{i=1}^A\prod_{j=1}^B\gcd(i,j)^{-C}\times\prod_{i=1}^A\prod_{j=1}^C\gcd(i,k)^{-B}
前两部分(分子)直接预处理阶乘+快速幂,后半部分为:
\prod_{i=1}^A\prod_{j=1}^B\gcd(i,j)^C\\(枚举\gcd)=\prod_{d=1}^{\min(A,B)}\prod_{i=1}^{\left\lfloor\frac{A}{d}\right\rfloor}\prod_{j=1}^{\left\lfloor\frac{B}{d}\right\rfloor}d^{C[\gcd(i,j)=1]}\\(把i,j放到指数上)=\prod_{d=1}^{\min(A,B)}d^{\sum\limits_{i=1}^{\left\lfloor\frac{A}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{B}{d}\right\rfloor}C[\gcd(i,j)=1]}\\(按套路反演)=\prod_{d=1}^{\min(A,B)}d^{{C\sum\limits_{p=1}^{\min(\left\lfloor\frac{A}{d}\right\rfloor,\left\lfloor\frac{B}{d}\right\rfloor)}}\left\lfloor\frac{A}{pd}\right\rfloor\left\lfloor\frac{B}{pd}\right\rfloor\mu(p)}
预处理 \mu 的前缀和,然后整除分块套整除分块即可。
type=1:
\prod_{i=1}^{A}\prod_{j=1}^{B}\prod_{k=1}^C{\left(\frac{ij}{\gcd(i,j)\gcd(i,k)}\right)}^{ijk}\\
=\prod_{i=1}^Ai^{i\sum\limits_{j=1}^Bj\sum\limits_{k=1}^Ck}\prod_{j=1}^Bj^{j\sum\limits_{i=1}^Ai\sum\limits_{k=1}^Ck}\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^{C}\gcd(i,j)^{-ijk}\times\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^{C}\gcd(i,k)^{-ijk}
前半部分(分子)为
\prod_{i=1}^A (i^i)^{B(B+1)C(C+1)/4}
预处理 i^i 的前缀积就可以直接算了。
设 D=C(C+1)/2 ,后半部分(分母)为
\prod_{i=1}^A\prod_{j=1}^B\gcd(i,j)^{ijD}\\(枚举\gcd)=\prod_{d=1}^{\min(A,B)}\prod_{i=1}^{\left\lfloor\frac{A}{d}\right\rfloor}\prod_{j=1}^{\left\lfloor\frac{B}{d}\right\rfloor}d^{d^2ijD[\gcd(i,j)=1]} \\(把i,j放到指数上)=\prod_{d=1}^{\min(A,B)}d^{\sum\limits_{i=1}^{\left\lfloor\frac{A}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{B}{d}\right\rfloor}Dijd^2[\gcd(i,j)=1]} \\(向上面那样按套路反演)=\prod_{d=1}^{\min(A,B)}d^{{D\sum\limits_{p=1}^{\min(\left\lfloor\frac{A}{d}\right\rfloor,\left\lfloor\frac{B}{d}\right\rfloor)}}\sum\limits_{i=1}^{\left\lfloor\frac{A}{pd}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{B}{pd}\right\rfloor}d^2p^2ij \mu(p)}\\=(\prod_{d=1}^{\min(A,B)}d^{d^2})^{D\sum\limits_{p=1}^{\min(\left\lfloor\frac{A}{d}\right\rfloor,\left\lfloor\frac{B}{d}\right\rfloor)}p^2\mu(p)\frac{\left\lfloor\frac{A}{dp}\right\rfloor(\left\lfloor\frac{A}{dp}\right\rfloor+1)}{2}\frac{\left\lfloor\frac{B}{dp}\right\rfloor(\left\lfloor\frac{B}{dp}\right\rfloor+1)}{2}}
预处理 d^{d^2} 的前缀积,预处理 p^2 \mu(p) 的前缀和然后整除分块套整除分块即可。
type=2(重头戏来了!)
\prod_{i=1}^{A}\prod_{j=1}^{B}\prod_{k=1}^C{\left(\frac{ij}{\gcd(i,j)\gcd(i,k)}\right)}^{\gcd(i,j,k)}
\\=\prod_{i=1}^{A}\prod_{j=1}^{B}\prod_{k=1}^Ci^{\gcd(i,j,k)}\prod_{i=1}^{A}\prod_{j=1}^{B}\prod_{k=1}^Cj^{\gcd(i,j,k)}\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^{C}\gcd(i,j)^{-\gcd(i,j,k)}\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^{C}\gcd(i,k)^{-\gcd(i,j,k)}
前半部分(分子)为
后半部分:
\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^{C}\gcd(i,j)^{\gcd(i,j,k)}\\(把i,j放指数上并枚举\gcd)=\prod_{d=1}^{\min(A,B)}d^{\sum\limits_{i=1}^{\left\lfloor\frac{A}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{B}{d}\right\rfloor}[\gcd(i,j)=1]\sum\limits_{k=1}^C\gcd(d,k)}\\(按套路反演)=\prod_{d=1}^{\min(A,B)}d^{\sum\limits_{i=1}^{\left\lfloor\frac{A}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{B}{d}\right\rfloor}\sum\limits_{t|i,t|j}\mu(t)\sum\limits_{k=1}^C\gcd(d,k)}\\(化简)=\prod_{d=1}^{\min(A,B)}d^{\sum\limits_{t=1}^{\left\lfloor\frac{A}{d}\right\rfloor}\mu(t){\left\lfloor\frac{A}{td}\right\rfloor}{\left\lfloor\frac{B}{td}\right\rfloor}\sum\limits_{k=1}^C\gcd(d,k)}\\(设T=dt)=\prod_{T=1}^{\min(A,B)}\prod_{d|T}d^{\mu(\frac{T}{d}){\left\lfloor\frac{A}{T}\right\rfloor}{\left\lfloor\frac{B}{T}\right\rfloor}\sum\limits_{k=1}^C\gcd(d,k)}\\(把式子写好看一点)=\prod_{T=1}^{\min(A,B)}{\left(\prod_{d|T}d^{\mu(\frac{T}{d})\sum\limits_{k=1}^C\gcd(d,k)}\right)^{{\left\lfloor\frac{A}{T}\right\rfloor}{\left\lfloor\frac{B}{T}\right\rfloor}}}
把中间的指数部分提出来
\sum\limits_{k=1}^C\gcd(d,k)\\
=\sum\limits_{p|d}p\sum\limits_{k=1}^{\left\lfloor\frac{C}{p}\right\rfloor}[\gcd(\frac{C}{d},k)=1]
\\=\sum\limits_{p|d}p\sum\limits_{t|\frac{d}{p}}\mu(t){\left\lfloor\frac{C}{pt}\right\rfloor}\\
=\sum\limits_{s|d}{\left\lfloor\frac{C}{s}\right\rfloor\phi(s)}
再扔回去
\prod_{T=1}^{\min(A,B)}{\left(\prod_{d|T}d^{\mu(\frac{T}{d})\sum\limits_{s|d}{\left\lfloor\frac{C}{s}\right\rfloor\phi(s)}}\right)^{{\left\lfloor\frac{A}{T}\right\rfloor}{\left\lfloor\frac{B}{T}\right\rfloor}}}\\(把枚举s放下面)=\prod_{T=1}^{\min(A,B)}{\left(\prod_{d|T}\prod\limits_{s|d}d^{\mu(\frac{T}{d}){\left\lfloor\frac{C}{s}\right\rfloor\phi(s)}}\right)^{{\left\lfloor\frac{A}{T}\right\rfloor}{\left\lfloor\frac{B}{T}\right\rfloor}}}
发现仍然不好算,orz题解后发现可以把 s 和 \frac{d}{s} 分开算。
\prod_{T=1}^{\min(A,B)}{{\prod_{d|T}\prod\limits_{s|d}\frac{d}{s}^{\mu(\frac{T}{d})\phi(s)\left\lfloor\frac{C}{s}\right\rfloor\left\lfloor\frac{A}{T}\right\rfloor\left\lfloor\frac{B}{T}\right\rfloor}}}\\(交换枚举顺序,T\div s,d\div s)=\prod_{s=1}^{\min(A,B)}\prod_{T=1}^{\left\lfloor\frac{\min(A,B)}{s}\right\rfloor}{{\prod_{d|T}d^{\mu(\frac{T}{d})\phi(s)\left\lfloor\frac{C}{s}\right\rfloor\left\lfloor\frac{A}{Ts}\right\rfloor\left\lfloor\frac{B}{Ts}\right\rfloor}}}\\(最后整理一下)=\prod_{s=1}^{\min(A,B)}\left(\prod_{T=1}^{\left\lfloor\frac{\min(A,B)}{s}\right\rfloor}{\left({\prod_{d|T}d^{\mu(\frac{T}{d})}}\right)}^{\left\lfloor\frac{\left\lfloor\frac{A}{T}\right\rfloor}{s}\right\rfloor\left\lfloor\frac{\left\lfloor\frac{B}{T}\right\rfloor}{s}\right\rfloor}\right)^{\phi(s)\left\lfloor\frac{C}{s}\right\rfloor}
最里面一层 O(n\log n) 预处理,外面两层整除分块即可。(和上面反演的方法基本一样,就不写注释了)
\prod_{T=1}^{\min(A,B)}{{\prod_{d|T}\prod\limits_{s|d}s^{\mu(\frac{T}{d})\phi(s)\left\lfloor\frac{C}{s}\right\rfloor\left\lfloor\frac{A}{T}\right\rfloor\left\lfloor\frac{B}{T}\right\rfloor}}}
\\=\prod_{s=1}^{\min(A,B)}\prod_{T=1}^{\left\lfloor\frac{\min(A,B)}{s}\right\rfloor}\prod\limits_{d|T}s^{\mu(\frac{T}{d})\phi(s)\left\lfloor\frac{C}{s}\right\rfloor\left\lfloor\frac{A}{Ts}\right\rfloor\left\lfloor\frac{B}{Ts}\right\rfloor}
\\=\prod_{s=1}^{\min(A,B)}s^{\sum\limits_{T=1}^{\left\lfloor\frac{\min(A,B)}{s}\right\rfloor}\sum\limits_{d|T}\mu(\frac{T}{d})\phi(s)\left\lfloor\frac{C}{s}\right\rfloor\left\lfloor\frac{A}{Ts}\right\rfloor\left\lfloor\frac{B}{Ts}\right\rfloor}
\\=\prod_{s=1}^{\min(A,B)}s^{\phi(s)\left\lfloor\frac{C}{s}\right\rfloor\sum\limits_{T=1}^{\left\lfloor\frac{\min(A,B)}{s}\right\rfloor}\left\lfloor\frac{A}{Ts}\right\rfloor\left\lfloor\frac{B}{Ts}\right\rfloor\sum\limits_{d|T}\mu(\frac{T}{d})}
\\=\prod_{s=1}^{\min(A,B)}s^{\phi(s)\left\lfloor\frac{C}{s}\right\rfloor\sum\limits_{T=1}^{\left\lfloor\frac{\min(A,B)}{s}\right\rfloor}\left\lfloor\frac{A}{Ts}\right\rfloor\left\lfloor\frac{B}{Ts}\right\rfloor\epsilon(T)}
因为 \epsilon(T)=[T=1] ,所以可以直接把 T 看作 1,那么
\prod_{s=1}^{\min(A,B)}s^{\phi(s)\left\lfloor\frac{C}{s}\right\rfloor\sum\limits_{T=1}^{\left\lfloor\frac{\min(A,B)}{s}\right\rfloor}\left\lfloor\frac{A}{Ts}\right\rfloor\left\lfloor\frac{B}{Ts}\right\rfloor\epsilon(T)}
\\=\prod_{s=1}^{\min(A,B)}s^{\phi(s)\left\lfloor\frac{C}{s}\right\rfloor\left\lfloor\frac{A}{s}\right\rfloor\left\lfloor\frac{B}{s}\right\rfloor}
终于出现了一个漂亮的式子啊!然后我震惊地发现,这个部分和分子的 \prod_{T=1}^{A}\left(T^{\phi(T)}\right)^{\left\lfloor\frac{A}{T}\right\rfloor\left\lfloor\frac{B}{T}\right\rfloor\left\lfloor\frac{C}{T}\right\rfloor} 部分可以约掉!所以我们实际要算的分子是
\prod_{T=1}^{A}(\left\lfloor\frac{A}{T}\right\rfloor!)^{\phi(T){\left\lfloor\frac{B}{T}\right\rfloor}{\left\lfloor\frac{C}{T}\right\rfloor}}
分母是
\prod_{s=1}^{\min(A,B)}\left(\prod_{T=1}^{\left\lfloor\frac{\min(A,B)}{s}\right\rfloor}
{\left({\prod_{d|T}d^{\mu(\frac{T}{d})}}\right)}^
{\left\lfloor\frac{\left\lfloor\frac{A}{T}\right\rfloor}{s}\right\rfloor
\left\lfloor\frac{\left\lfloor\frac{B}{T}\right\rfloor}{s}\right\rfloor}
\right)^{\phi(s)\left\lfloor\frac{C}{s}\right\rfloor}
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
namespace FGF
{
int n,mo,phi;
const int N=1e5+5;
ll A,B,C,fac[N],mu[N],inv[N],dd2[N],p2[N],dd[N],sumphi[N],ph[N],h[N],ifac[N];
ll ih[N];
int p[N],vis[N],cnt;
ll qpow(ll x,ll y)
{
ll s=1;
while(y)
{
if(y&1)s=s*x%mo;
x=x*x%mo,y>>=1;
}
return s;
}
void init()
{
ih[0]=ifac[0]=h[0]=dd[0]=dd2[0]=fac[0]=inv[0]=inv[1]=1;
for(int i=1;i<=1e5;i++)
fac[i]=fac[i-1]*i%mo,h[i]=1;
for(int i=2;i<=1e5;i++)
inv[i]=inv[mo%i]*(mo-mo/i)%mo;
for(int i=1;i<=1e5;i++)
ifac[i]=ifac[i-1]*inv[i]%mo;
for(int i=1;i<=1e5;i++)
dd2[i]=dd2[i-1]*qpow(i,1LL*i*i%phi)%mo;
for(int i=1;i<=1e5;i++)
dd[i]=dd[i-1]*qpow(i,i)%mo;
mu[1]=1,ph[1]=1;
for(int i=2;i<=1e5;i++)
{
if(!vis[i])p[++cnt]=i,mu[i]=phi-1,ph[i]=i-1;
for(int j=1;j<=cnt&&p[j]*i<=1e5;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0){mu[i*p[j]]=0;ph[i*p[j]]=ph[i]*p[j];break;}
mu[i*p[j]]=phi-mu[i],ph[i*p[j]]=ph[i]*(p[j]-1);
}
}
for(int i=1;i<=1e5;i++)
sumphi[i]=(sumphi[i-1]+ph[i])%phi;
for(int i=1;i<=1e5;i++)
p2[i]=(p2[i-1]+1LL*i*i%phi*mu[i]%phi)%(mo-1);
for(int i=1;i<=1e5;i++)
for(int j=i;j<=1e5;j+=i)
if(mu[j/i]==1)h[j]=h[j]*i%mo;
else if(mu[j/i]==phi-1)h[j]=h[j]*inv[i]%mo;
for(int i=1;i<=1e5;i++)
h[i]=h[i-1]*h[i]%mo,ih[i]=qpow(h[i],mo-2);
for(int i=2;i<=1e5;i++)mu[i]=(mu[i]+mu[i-1])%phi;
}
ll getans1(ll a,ll b,ll c)
{
ll ans=1;
for(int l=1,r;l<=min(a,b);l=r+1)
{
ll d=a/l,e=b/l;
r=min(a/d,b/e);
ll p=fac[r]*ifac[l-1]%mo,sum=0;
for(int ql=1,qr;ql<=min(d,e);ql=qr+1)
{
qr=min(d/(d/ql),e/(e/ql));
ll k=(mu[qr]-mu[ql-1]+phi)%phi;
sum=(sum+k*(d/ql)%phi*(e/ql)%phi)%phi;
}
ans=ans*qpow(qpow(p,sum*c%phi),mo-2)%mo;
}
return ans;
}
ll solve1(ll a,ll b,ll c)
{
ll ans=qpow(fac[a],b*c%(mo-1))*qpow(fac[b],a*c%(mo-1))%mo;
return ans*getans1(a,b,c)%mo*getans1(a,c,b)%mo;
}
ll getans2(ll a,ll b,ll c)
{
ll D=c*(c+1)/2%phi,ans=1;
for(int l=1,r;l<=min(a,b);l=r+1)
{
ll d=a/l,e=b/l;
r=min(a/d,b/e);
ll p=dd2[r]*qpow(dd2[l-1],mo-2)%mo,sum=0;
for(int ql=1,qr;ql<=min(d,e);ql=qr+1)
{
ll g=d/ql,f=e/ql;
qr=min(d/g,e/f);
ll k=(p2[qr]-p2[ql-1]+phi)%phi;
sum=(sum+(g*(g+1)/2%phi)%phi*(f*(f+1)/2%phi)%phi*k%phi)%phi;
}
ans=ans*qpow(qpow(p,sum*D%phi),mo-2)%mo;
}
return ans;
}
ll solve2(ll a,ll b,ll c)
{
ll ans=qpow(dd[a],(b*(b+1)/2%phi)%phi*(c*(c+1)/2%phi)%phi)*qpow(dd[b],(a*(a+1)/2%phi)%phi*(c*(c+1)/2%phi)%phi)%mo;
return ans*getans2(a,b,c)%mo*getans2(a,c,b)%mo;
}
ll getans31(ll a,ll b,ll c)
{
ll s=1;
for(int l=1,r;l<=min(a,min(b,c));l=r+1)
{
r=min(a/(a/l),min(b/(b/l),c/(c/l)));
s=s*qpow(fac[a/l],(sumphi[r]-sumphi[l-1]+phi)%phi*(b/l)%phi*(c/l)%phi)%mo;
}
return s;
}
ll getans32(ll a,ll b,ll c)
{
ll ans=1;
for(int l=1,r;l<=min(a,min(b,c));l=r+1)
{
ll d=a/l,e=b/l,sum=1;
r=min(a/d,min(b/e,c/(c/l)));
for(int ql=1,qr;ql<=min(d,e);ql=qr+1)
{
qr=min(d/(d/ql),e/(e/ql));
sum=sum*qpow(h[qr]*ih[ql-1]%mo,(d/ql)*(e/ql)%phi)%mo;
}
ans=ans*qpow(sum,(sumphi[r]-sumphi[l-1]+phi)%phi*(c/l)%phi)%mo;
}
return ans;
}
ll solve3(ll a,ll b,ll c)
{
return getans31(a,b,c)*getans31(b,a,c)%mo*qpow(getans32(a,b,c),mo-2)%mo*qpow(getans32(a,c,b),mo-2)%mo;
}
void work()
{
scanf("%d%d",&n,&mo),phi=mo-1;
init();
while(n--)
{
scanf("%lld%lld%lld",&A,&B,&C);
printf("%lld %lld %lld \n",solve1(A,B,C),solve2(A,B,C),solve3(A,B,C));
}
}
}
int main()
{
FGF::work();
return 0;
}
顺便放一下,机房巨佬用另一种做法推出来的式子是,我也不知道这玩意能不能算。
\large\prod_{t=1}^{\min(A,B,C)}\prod\limits_{s=1}^{\min(\left\lfloor\frac{\min(A,B)}{t}\right\rfloor,\left\lfloor\frac{C}{t}\right\rfloor)}\prod_{d=1}^{\left\lfloor\frac{\min(A,B)}{ts}\right\rfloor}(dts)^{\left\lfloor\frac{C}{ts}\right\rfloor t\mu(s)\sum\limits_{p=1}^{\min(\left\lfloor\frac{A}{dts}\right\rfloor,\left\lfloor\frac{B}{dts}\right\rfloor)}\left\lfloor\frac{A}{dpts}\right\rfloor \left\lfloor\frac{B}{dpts}\right\rfloor \mu(p)}