#莫比乌斯反演,欧拉函数#洛谷 5518 [MtOI2019]幽灵乐团
分析
前置知识:\(\sum_{d|n}\mu(d)=[n==1]\),\(\sum_{d|n}\mu(d)\frac{n}{d}=\varphi(n)\)
把最小公倍数拆开可以得到
\]
一个一个类型解决,并且拆开分子分母,先看 \(type=0\) 的情况,
分子 \(=\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C(ij)=[(A!)^B(B!)^A]^C\)
分母以 \(\gcd(i,j)\) 为例也即是 \(=\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C\gcd(i,j)\)
枚举 \(d=\gcd(i,j)\) 也即是
\]
\]
枚举 \(i=dt\) 即
\]
设 \(f(n)=\prod_{d|n}d^{\mu\left(\frac{n}{d}\right)}\),然后整个就可以整除分块。
设 \(S1(A,B)=\prod_{i=1}^{\min\{A,B\}}f(i)^{\left\lfloor\frac{A}{i}\right\rfloor\left\lfloor\frac{B}{i}\right\rfloor}\)
那么合起来当 \(type=0\) 时答案为 \(\large \frac{\left[(A!)^B(B!)^A\right]^C}{S1(A,B)^CS1(A,C)^B}\)
再看 \(type=1\) 的情况,设 \(c2(n)=\binom{n+1}{2}\) 分子为
\]
设 \(g(n)=\prod_{i=1}^n\left(i^i\right)\),那也就是 \(=\left[g(A)^{c2(B)}g(B)^{c2(A)}\right]^{c2(C)}\)
分母同样以 \(\gcd(i,j)\) 为例, 即为 \(\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C\gcd(i,j)^{ijk}\)
枚举 \(d=\gcd(i,j)\),也即是
\]
\]
枚举 \(i=dt\) 即
\]
设 \(S2(A,B)=\prod_{i=1}^{\min\{A,B\}}f(i)^{i^2\left\lfloor\frac{A}{i}\right\rfloor\left\lfloor\frac{B}{i}\right\rfloor}\)
那么合起来当 \(type=1\) 时答案为 \(\large \frac{\left[g(A)^{c2(B)}g(B)^{c2(A)}\right]^{c2(C)}}{S2(A,B)^CS2(A,C)^B}\)
再看 \(type=2\) 的情况,
分子 \(=\prod_{i=1}^{A}\prod_{j=1}^B\prod_{k=1}^C(ij)^{\gcd(i,j,k)}\)
枚举 \(d=\gcd(i,j,k)\),也即是
\]
\]
枚举 \(o=dt\),也即是
\]
\]
分母如果先枚举 \(\gcd(i,j)\) 里面向下取整的式子无法预处理出来,
以 \(\gcd(i,j)\) 为例,不妨先枚举 \(\gcd(i,j,k)\)
\]
\]
枚举 \(o=dt\),也即是
\]
实际上由于分子分母都具有 \(\large \prod_{o=1}^{\min\{A,B,C\}}o^{2\varphi(o)\left\lfloor\frac{A}{o}\right\rfloor\left\lfloor\frac{B}{o}\right\rfloor\left\lfloor\frac{C}{o}\right\rfloor}\)(分母上式要算两次)
设 \(\large S3(A,B,C)=\prod_{o=1}^{\min\{A,B,C\}}\prod_{i=1}^{\left\lfloor\frac{A}{o}\right\rfloor}\prod_{j=1}^{\left\lfloor\frac{B}{o}\right\rfloor}{\gcd(i,j)}^{\varphi(o)\left\lfloor\frac{C}{o}\right\rfloor}\)
所以合起来可以进行第一步化简
继续看分母,枚举 \(d=\gcd(i,j)\)
\]
\]
枚举 \(i=dt\),则
\]
\]
那么 \(\large S3(A,B,C)=\prod_{o=1}^{\min\{A,B,C\}}\left(\prod_{i=1}^{\min\left\{\left\lfloor\frac{A}{o}\right\rfloor,\left\lfloor\frac{B}{o}\right\rfloor,\left\lfloor\frac{C}{o}\right\rfloor\right\}}f(i)^{\left\lfloor\frac{A}{oi}\right\rfloor\left\lfloor\frac{B}{oi}\right\rfloor}\right)^{\varphi(o)\left\lfloor\frac{C}{o}\right\rfloor}\)
合起来当 \(type=2\) 时答案为
\]
以上需要预处理的函数都可以在 \(O(n\log{n})\) 内预处理出来,瓶颈时间复杂度即求 \(S3(A,B,C)\) 时为 \(O(Tn^{\frac{3}{4}}\log{n})\)
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=100011;
int mu[N],phi[N],fac[N],inv[N],prime[N],c2[N];
int Cnt,f[N],F[N],invf[N],g[N],invF[N],T,mod,Phi;
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int ksm(int x,int y){
int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
int mo(int x,int y){return x+y>=Phi?x+y-Phi:x+y;}
int min(int a,int b){return a<b?a:b;}
void Pro(int n){
mu[1]=phi[1]=fac[0]=fac[1]=inv[0]=inv[1]=1;
for (int i=2;i<=n;++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for (int i=2;i<=n;++i) fac[i]=1ll*fac[i-1]*i%mod;
for (int i=2;i<=n;++i){
if (!phi[i]) prime[++Cnt]=i,phi[i]=i-1,mu[i]=-1;
for (int j=1;j<=Cnt&&prime[j]<=n/i;++j){
phi[i*prime[j]]=phi[i]*phi[prime[j]];
if (i%prime[j]==0){
phi[i*prime[j]]+=phi[i];
break;
}
mu[i*prime[j]]=-mu[i];
}
}
for (int i=1;i<=n;++i) phi[i]=mo(phi[i],phi[i-1]);
for (int i=1;i<=n;++i) c2[i]=(c2[i-1]+i)%Phi;
for (int i=0;i<=n;++i) f[i]=1,g[i]=ksm(i,i);
for (int i=1;i<=n;++i) g[i]=1ll*g[i-1]*g[i]%mod;
for (int i=1;i<=n;++i)
for (int j=i;j<=n;j+=i)
if (mu[j/i]==1) f[j]=1ll*f[j]*i%mod;
else if (mu[j/i]==-1) f[j]=1ll*f[j]*inv[i]%mod;
for (int i=0;i<=n;++i) F[i]=ksm(f[i],1ll*i*i%Phi);
for (int i=1;i<=n;++i) f[i]=1ll*f[i-1]*f[i]%mod;
for (int i=1;i<=n;++i) F[i]=1ll*F[i-1]*F[i]%mod;
for (int i=1;i<=n;++i) inv[i]=1ll*inv[i-1]*inv[i]%mod;
for (int i=0;i<=n;++i) invf[i]=ksm(f[i],mod-2);
for (int i=0;i<=n;++i) invF[i]=ksm(F[i],mod-2);
}
int query1(int n,int m){
int t=min(n,m),ans=1;
for (int l=1,r;l<=t;l=r+1){
r=min(n/(n/l),m/(m/l));
ans=1ll*ans*ksm(1ll*f[r]*invf[l-1]%mod,1ll*(n/l)*(m/l)%Phi)%mod;
}
return ans;
}
int query2(int n,int m){
int t=min(n,m),ans=1;
for (int l=1,r;l<=t;l=r+1){
r=min(n/(n/l),m/(m/l));
ans=1ll*ans*ksm(1ll*F[r]*invF[l-1]%mod,1ll*c2[n/l]*c2[m/l]%Phi)%mod;
}
return ans;
}
int query3(int A,int B,int C){
int t=min(A,min(B,C)),ans=1,Ans=1;
for (int l=1,r;l<=t;l=r+1){
r=min(A/(A/l),min(B/(B/l),C/(C/l)));
int _A=A/l,_B=B/l,_C=C/l,sum=1,tt=1ll*mo(phi[r],Phi-phi[l-1])*(C/l)%Phi;
Ans=1ll*Ans*ksm(1ll*ksm(fac[A/l],B/l)*ksm(fac[B/l],A/l)%mod,tt)%mod;
for (int L=1,R;L<=_A&&L<=_B;L=R+1)
R=min(_A/(_A/L),_B/(_B/L)),sum=1ll*sum*ksm(1ll*f[R]*invf[L-1]%mod,1ll*(_A/L)*(_B/L)%Phi)%mod;
ans=1ll*ans*ksm(sum,tt)%mod,sum=1,tt=1ll*mo(phi[r],Phi-phi[l-1])*(B/l)%Phi;
for (int L=1,R;L<=_A&&L<=_C;L=R+1)
R=min(_A/(_A/L),_C/(_C/L)),sum=1ll*sum*ksm(1ll*f[R]*invf[L-1]%mod,1ll*(_A/L)*(_C/L)%Phi)%mod;
ans=1ll*ans*ksm(sum,tt)%mod;
}
return 1ll*Ans*ksm(ans,mod-2)%mod;
}
int main(){
T=iut(),mod=iut(),Phi=mod-1,Pro(N-11);
for (int i=1;i<=T;++i){
int A=iut(),B=iut(),C=iut();
print(1ll*ksm(1ll*ksm(fac[A],B)*ksm(fac[B],A)%mod,C)*ksm(1ll*ksm(query1(A,B),C)*ksm(query1(A,C),B)%mod,mod-2)%mod),putchar(32);
print(1ll*ksm(1ll*ksm(g[A],c2[B])*ksm(g[B],c2[A])%mod,c2[C])*ksm(1ll*ksm(query2(A,B),c2[C])*ksm(query2(A,C),c2[B])%mod,mod-2)%mod);
putchar(32),print(query3(A,B,C)),putchar(10);
}
return 0;
}
#莫比乌斯反演,欧拉函数#洛谷 5518 [MtOI2019]幽灵乐团的更多相关文章
- $BZOJ$2818 $gcd$ 莫比乌斯反演/欧拉函数
正解:莫比乌斯反演/欧拉函数 解题报告: 传送门$QwQ$ 一步非常显然的变形,原式=$\sum_{d=1,d\in prim}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd ...
- 洛谷 - P1390 - 公约数的和 - 莫比乌斯反演 - 欧拉函数
https://www.luogu.org/problemnew/show/P1390 求 $\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m} gcd(i,j) $ ...
- [luogu P2586] GCD 解题报告 (莫比乌斯反演|欧拉函数)
题目链接:https://www.luogu.org/problemnew/show/P2568#sub 题目大意: 计算$\sum_{x=1}^n\sum_{y=1}^n [gcd(x,y)==p ...
- luogu2658 GCD(莫比乌斯反演/欧拉函数)
link 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 1<=N<=10^7 (1)莫比乌斯反演法 发现就是YY的GCD,左转YY的GCD ...
- BZOJ2005:[NOI2010]能量采集(莫比乌斯反演,欧拉函数)
Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...
- HDU 6390 GuGuFishtion(莫比乌斯反演 + 欧拉函数性质 + 积性函数)题解
题意: 给定\(n,m,p\),求 \[\sum_{a=1}^n\sum_{b=1}^m\frac{\varphi(ab)}{\varphi(a)\varphi(b)}\mod p \] 思路: 由欧 ...
- 洛谷 P5518 - [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题(莫比乌斯反演+整除分块)
洛谷题面传送门 一道究极恶心的毒瘤六合一题,式子推了我满满两面 A4 纸-- 首先我们可以将式子拆成: \[ans=\prod\limits_{i=1}^A\prod\limits_{j=1}^B\p ...
- BZOJ4804 欧拉心算(莫比乌斯反演+欧拉函数+线性筛)
一通套路后得Σφ(d)μ(D/d)⌊n/D⌋2.显然整除分块,问题在于怎么快速计算φ和μ的狄利克雷卷积.积性函数的卷积还是积性函数,那么线性筛即可.因为μ(pc)=0 (c>=2),所以f(pc ...
- BZOJ.2705.[SDOI2012]Longge的问题(莫比乌斯反演 欧拉函数)
题目链接 \(Description\) 求\[\sum_{i=1}^n\gcd(i,n)\] \(Solution\) \[ \begin{aligned} \sum_{i=1}^n\gcd(i,n ...
- Bzoj 2818: Gcd 莫比乌斯,分块,欧拉函数,线性筛
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3241 Solved: 1437[Submit][Status][Discuss ...
随机推荐
- win32- 使用WM_NCPAINT在非客户区域绘制边框
#pragma comment(lib, "UxTheme") #include <windows.h> #include <uxtheme.h> LRES ...
- 【Android逆向】脱壳项目 frida-dexdump 原理分析
1. 项目代码地址 https://github.com/hluwa/frida-dexdump 2. 核心逻辑为 def dump(self): logger.info("[+] Sear ...
- Redis客户端汇总
编程客户端 已经支持了许多编程语言,详见:https://redis.io/docs/clients/ 图形客户端 1.Another Redis Desktop Manager 支持哨兵, 集群, ...
- springboot自动配置原理以及spring.factories文件的作用详解
一.springboot 自动配置原理 先说说我们自己的应用程序中Bean加入容器的办法: package com.ynunicom.dc.dingdingcontractapp; import co ...
- Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC
前言 前面烧写一直时烧写进入flush,是按照分区烧写.定制的板子挂的是eMMC,前面的烧写步骤一致,但是在烧写目标则时烧写eMMC了. 重新走一遍从无到有通过网口刷定制板卡的uboot.ker ...
- 【Azure 媒体服务】记使用 Media Service 的官网示例代码 Audio Analyzer 出现卡顿在 Creating event processor host .. 直到 Timeout 问题
问题描述 在使用Azure Media Service的官网示例 (media-services-v3-java --> AudioAnalytics --> AudioAnalyzer ...
- 连接 AI,NebulaGraph Python ORM 项目 Carina 简化 Web 开发
作者:Steam & Hao 本文整理自社区第 7 期会议中 13'21″ 到 44'11″ 的 Python ORM 的分享,视频见 https://www.bilibili.com/vid ...
- [vbs] 定时关闭进程代码
Dim bag,pipe do Set bag=GetObject("WinMgmts:") Set pipe=bag.execquery("select * from ...
- C++ 错误 具有类型“const sort”的表达式会丢失一些 const-volatile 限定符以调用“bool sort::operator ()(int,int)” 如下:环境 vs2019 内容:set内置函数排序
C++ 错误 具有类型"const sort"的表达式会丢失一些 const-volatile 限定符以调用"bool sort::operator ()(int,int ...
- 10、zookeeper的leader选举
leader选举 服务器状态 looking:寻找leader状态.当服务器处于该状态时,它会认为当前集群中没有leader,因此需要进入leader选举状态 following:跟随着状态.表明当前 ...