#莫比乌斯反演,欧拉函数#洛谷 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 ...
随机推荐
- 项目实战:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组合多轴拽拖旋转,支持导入点云文件)
需求 开发基于osg的三维点云引擎模块. 1.基于x,y,z坐标轴. 2.可设置原点,设置缩放比例. 3.可设置y轴和z轴单位. 4.三轴中,XY为2D图的水平.竖直方向:Z轴,对应高度图 ...
- 泛型类Generic注解
在 Python 的 typing 模块中,Generic 是一个泛型类,用于创建参数化的类和函数,以便支持不同类型的参数.它允许你定义具有类型参数的类,这些类型参数在实例化时才确定.这样,你可以在不 ...
- 【LeetCode栈与队列#05】滑动窗口最大值
滑动窗口最大值 力扣题目链接(opens new window) 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口 ...
- AI 让观众成为 3D 版《老友记》的导演了?
<老友记>上线 3D 版了? 允许用户旋转镜头,且从近景切换到全景观看故事? 今年出炉的 3D 方向 AI 项目 SitCom3D,能够自动补齐<老友记>原剧中的三维拍摄空间, ...
- 数据库运维 | 携程分布式图数据库NebulaGraph运维治理实践
作者简介:Patrick Yu,携程云原生研发专家,关注非关系型分布式数据存储及相关技术. 背景 随着互联网世界产生的数据越来越多,数据之间的联系越来越复杂层次越来越深,人们希望从这些纷乱复杂的数据中 ...
- spark 下java list 或者scala list 转DataFrame or DataSet 总结
一.JAVA list 转 DataFrame or DataSet case class CaseJava( var num: String, var id: String, var start_t ...
- welearn平台答案 大学英语 视听说 综合教程
打开页面 1. F12 2. ctrl+shift+c 3. 鼠标移动到选项位置 4. 带data-solution的就是答案
- 【学习笔记】 - 基础数据结构 :Link-Cut Tree(进阶篇)
前言 LCT没题写可以去写树剖和一些线段树合并的题练手 LCT 的概念 原本的树剖是对树进行剖分,剖分为重边和轻边 LCT则是对于树分为虚边和实边,特殊的,LCT可以没有虚边(例:银河英雄传说v2) ...
- docker 系列
docker 系列 目录 docker 系列 一. docker 定义 1 nameSpnce 命名空间 2 cgroup 控制组 3 为什么使用容器 二. docker 安装 三 .docker 初 ...
- 1.JAVA中的几种基本数据类型是什么,各自占用多少字节
1.JAVA中的几种基本数据类型是什么,各自占用多少字节 基本类型 大小 最小值 最大值 默认值 byte(位) 8bits = 1字节 -128 127 0 short(短整数) 16bit = 2 ...