MtOI2019 幽灵乐团
我来吃屎了,哈哈啊哈哈哈啊哈哈啊哈!!!!!!!!!
发现对于题目要求的式子:
那么考虑把这个式子剥离开,得到:
\(type=0\)
先简化 \(P_1,P_2\):
容易想到:
考虑怎么把指数上的式子反演掉,设:
对于 \(F(n)\),容易理解如果 \(gcd(i,j)\mid n\),那么 \(i\mid n\),\(j\mid n\)。
因为 \([1,a]\) 中有 \(\lfloor\dfrac{a}{n}\rfloor\) 个,\([1,b]\) 中有 \(\lfloor\dfrac{b}{n}\rfloor\) 个且两两组合都可以,所以 \(F(n)=\lfloor\dfrac{a}{n}\rfloor\times \lfloor\dfrac{b}{n}\rfloor\)。
那么对这个式子进行莫比乌斯反演,得到:
设 \(t=\lfloor\dfrac{k}{d}\rfloor\),那么就有:
也就是:
发现就是「HAOI2011」Problem b。
带回原式,得到:
设 \(T=dt\),把 \(td\) 一样的放在一起考虑,得到:
枚举 \(d\),找到 \(T\) 把答案加上去,最后算次方再乘起来,时间复杂度为 \(O(n\log n)\)。
\(type=1\)
考虑怎么求解:
把后面提出来,得到:
需要用欧拉降幂。
考虑后面怎么推:
把 \(\prod\limits_{k=1}^C\) 拿出来,得到:
类似于 \(type=0\) 的时候,我们可以发反演得到:
其中 \(S(x)=\dfrac{x\times(x-1)}{2}\)。
\(type=2\)
对于指数的情况,直接开 \(\log\)。
得到:
考虑证明一下,有欧拉反演:
那么:
带入,得到:
令 \(i\gets di,j\gets dj,k\gets dk\),得到:
把 \(\varphi(d)\) 拿出来,得到:
把后面的 \(d\) 消了:
那么整体把 \(\ln\) 拿掉得到:
发现里面就是 \(type=0\) 的情况,做完了。
实现
一些数组的意义:
/*
https://www.cnblogs.com/liudagou/p/18686280
_______________#########_______________________
______________############_____________________
______________#############____________________
_____________##__###########___________________
____________###__######_#####__________________
____________###_#######___####_________________
___________###__##########_####________________
__________####__###########_####_______________
________#####___###########__#####_____________
_______######___###_########___#####___________
_______#####___###___########___######_________
______######___###__###########___######_______
_____######___####_##############__######______
____#######__#####################_#######_____
____#######__##############################____
___#######__######_#################_#######___
___#######__######_######_#########___######___
___#######____##__######___######_____######___
___#######________######____#####_____#####____
____######________#####_____#####_____####_____
_____#####________####______#####_____###______
______#####______;###________###______#________
________##_______####________####______________
*/
#include<iostream>
#include<bitset>
#include<algorithm>
#define int long long
using namespace std;
const int N=1e5+5;
int T,A,B,C,p,jc[N],I[N],mu[N],phi[N],pri[N],tot,invf1[N],invf2[N],f1[N],f2[N];
int P(int a,int b){
int ans=1;
while(b){
if(b&1) ans=ans*a%p;
a=a*a%p,b>>=1;
}
return ans;
}
bitset<N>vis;
void init(){
jc[0]=I[0]=1;
for(int i=1;i<N;i++){
jc[i]=jc[i-1]*i%p;
I[i]=I[i-1]*P(i,i)%p;
}
mu[1]=phi[1]=1;
for(int i=2;i<N;i++){
if(!vis[i]){
pri[++tot]=i,mu[i]=-1,phi[i]=i-1;
}
for(int j=1;j<=tot&&i*pri[j]<N;j++){
vis[i*pri[j]]=1;
if(!(i%pri[j])){
mu[i*pri[j]]=0;
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
mu[i*pri[j]]=-mu[i];
phi[i*pri[j]]=phi[i]*phi[pri[j]];
}
}
for(int i=0;i<N;i++){
f1[i]=1,phi[i]+=phi[i-1];
}
for(int i=1;i<N;i++) for(int j=i;j<N;j+=i){
f1[j]=f1[j]*P(i,(p-1+mu[j/i])%(p-1))%p;
}
for(int i=0;i<N;i++){
f2[i]=P(f1[i],i*i%(p-1));
}
invf1[0]=invf2[0]=1;
for(int i=1;i<N;i++){
f1[i]=f1[i]*f1[i-1]%p,invf1[i]=P(f1[i],p-2);
f2[i]=f2[i]*f2[i-1]%p,invf2[i]=P(f2[i],p-2);
}
}
int S(int x){
return x*(x+1)/2%(p-1);
}
int F(int A,int B){
int ans=1;
for(int L=1,R;L<=min(A,B);L=R+1){
int Aa=A/L,Bb=B/L;
R=min(A/Aa,B/Bb);
ans=ans*P(f1[R]*invf1[L-1]%p,Aa*Bb%(p-1))%p;
}
return ans;
}
int G(int A,int B){
int ans=1;
for(int L=1,R;L<=min(A,B);L=R+1){
R=min(A/(A/L),B/(B/L));
ans=ans*P(f2[R]*invf2[L-1]%p,S(A/L)*S(B/L)%(p-1))%p;
}
return ans;
}
int s1(int A,int B,int C){
return P(jc[A],B*C%(p-1))*P(jc[B],A*C%(p-1))%p*P(P(F(A,B),C)*P(F(A,C),B)%p,p-2)%p;
}
int s2(){
return P(P(I[A],S(B))*P(I[B],S(A))%p,S(C))*P(P(G(A,B),S(C))*P(G(A,C),S(B))%p,p-2)%p;
}
int s3(){
int ans=1;
for(int L=1,R;L<=min({A,B,C});L=R+1){
R=min({A/(A/L),B/(B/L),C/(C/L)});
ans=ans*P(s1(A/L,B/L,C/L),(phi[R]-phi[L-1])%(p-1))%p;
}
return ans;
}
void solve(){
cin>>A>>B>>C;
cout<<s1(A,B,C)<<' '<<s2()<<' '<<s3()<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>T>>p,init();
while(T--) solve();
return 0;
}

浙公网安备 33010602011771号