Очень насильственная практика пряной курицы
Учитывая эти два числа \ (\ GCD \) есть масса всей силы взять несколько \ (\ мин \) , два числа \ (\ гт LCM \) является масса всей силы взять несколько \ (\ макс \) , то окончательный ответ должен быть \ (\ Prod P_i C_i} ^ {\) , и где наибольшее простое число не превосходит \ (п \) , поэтому мы считаем , что расчетная мощность каждого простого числа, сколько
Таким образом , мы будем успешны \ (\ прод \) преобразуется в \ (\ СУММА \) , был прав по индексу \ (\ гт мод-1 \ ) по модулю
Для \ (\ RM типа = 0 \) , мы перечисляем простое число \ (р- \) , рассчитать его мощность
то есть
\ [\ Sum_ {г = 0} \ sum_ {J = 0} \ sum_ {к = 0} \ sum_ {Т_1 = 1} ^ {\ влево \ lfloor \ гидроразрыва {A}, {р ^ я} \ право \ rfloor } \ sum_ {t_2 = 1} ^ {\ влево \ lfloor \ гидроразрыва {B}, {р ^ J} \ право \ rfloor} \ sum_ {t_3 = 1} ^ {\ влево \ lfloor \ гидроразрыва {C}, {р ^ к} \ право \ rfloor} \ макс (I, J) - \ мин (я, к) [t_1 \ р преступник] [t_2 \ р преступник] [t_3 \ р преступник] \]
Это ясно ах, что мы перечисляем текущую максимальную мощность простых чисел, после того, как это перечисление имеет самое большое количество энергии, то есть, \ (р-я ^ \ Времена t_1 \) , но если \ (t_1 \) и \ (р \) не взаимно просты, то \ (я \) не \ (р ^ я \ раз т \) максимальной мощности, поэтому также должны убедиться , что \ (t_1 \ р \ преступник)
Мы должны изменить это порядок суммирования
\ [\ Sum_ {г = 0} \ sum_ {J = 0} \ sum_ {к = 0} \ тах (I, J) - \ мин (я, к) \ sum_ {Т_1 = 1} ^ {\ влево \ lfloor \ гидроразрыва {A}, {р ^ я} \ право \ rfloor} [t_1 \ преступник р] \ sum_ {t_2 = 1} ^ {\ влево \ lfloor \ гидроразрыва {B}, {р ^ J} \ право \ rfloor} [t_2 \ р преступник] \ sum_ {t_3 = 1} ^ {\ влево \ lfloor \ гидроразрыва {C}, {р ^ к} \ право \ rfloor} [t_3 \ р преступник] \]
Также найдено спрос \ (\ тах (I, J ) \) и \ (\ мин (я, к ) \) совершенно не зависит, так что мы можем быть вынуждены вниз в
\ [C \ раз \ sum_ {г = 0} \ sum_ {J = 0} \ тах (I, J) \ sum_ {Т_1 = 1} ^ {\ влево \ lfloor \ гидроразрыва {A}, {р ^ я} \ право \ rfloor} [t_1 \ р преступник] \ sum_ {t_2 = 1} ^ {\ влево \ lfloor \ гидроразрыва {B}, {р ^ J} \ право \ rfloor} [t_2 \ р преступник] \]
минус
\ [B \ раз \ sum_ {г = 0} \ sum_ {к = 0} \ мин (я, к) \ sum_ {Т_1 = 1} ^ {\ влево \ lfloor \ гидроразрыва {A}, {р ^ я} \ право \ rfloor} [t_1 \ р преступник] \ sum_ {t_3 = 1} ^ {\ влево \ lfloor \ гидроразрыва {C}, {р ^ к} \ право \ rfloor} [t_3 \ р преступник] \]
Теперь подумайте о \ (\ sum_ {t_1 = 1 } ^ {\ влево \ lfloor \ гидроразрыва {A} {р ^ я} \ право \ rfloor} [t_1 \ преступник р] \) в конце концов , как спрос, и простое число взаимных качество , если не кратен простого числа на линии, поэтому мы просто вычитанием \ (1 \) к \ (\ влево \ lfloor \ гидроразрыва {а} {р ^ я} \ право \ rfloor \) , где \ (р \) неоднократное, т.е. \ (\ влево \ lfloor \ гидроразрыва {а} {р ^ я} \ право \ rfloor- \ слева \ lfloor \ гидроразрыва {а} {р ^ {+ 1}} \ право \ rfloor \)
То есть, мы теперь требуется только
\ [B \ раз \ sum_ {г = 0} \ sum_ {J = 0} \ тах (I, J) (\ влево \ lfloor \ гидроразрыва {A}, {р ^ я} \ право \ rfloor- \ влево \ lfloor \ гидроразрыва {A}, {р ^ {+ 1}} \ право \ rfloor) (\ слева \ lfloor \ гидроразрыва {B}, {р ^ J} \ право \ rfloor- \ слева \ lfloor \ гидроразрыва {B}, {р ^ {j + 1}} право \ rfloor) \ \]
Мы можем непосредственно \ (O (\ log_p ^ 2 А) \) , чтобы вычислить хурму, но мы имеем дело с ним \ (\ влево \ lfloor \ гидроразрыва {A} {р ^ я} \ право \ rfloor- \ слева \ lfloor \ гидроразрыва {а} {р ^ { я + 1}} \ право \ rfloor \) приставка и обсудить сила может сделать \ (O (\ log_p а) \)
А \ (\ п) простых чисел в пределах примерно (\ гидроразрыва {п} {\ пер п} \) \ а, рассчитывается для каждого простого числа требует \ (O (\ log_p п) \) сложность, так что снова сложность, вероятно , \ (о (п) \) из
Для \ (\ RM типа = 1 \) , хурма стала
\ [\ Sum_ {г = 0} \ sum_ {J = 0} \ sum_ {к = 0} \ sum_ {Т_1 = 1} ^ {\ влево \ lfloor \ гидроразрыва {A}, {р ^ я} \ право \ rfloor } \ sum_ {t_2 = 1} ^ {\ влево \ lfloor \ гидроразрыва {B}, {р ^ J} \ право \ rfloor} \ sum_ {t_3 = 1} ^ {\ влево \ lfloor \ гидроразрыва {C}, {р ^ K} \ право \ rfloor} (\ макс (I, J) - \ мин (я, к)) \ раз t_1 \ раз t_2 \ раз t_3 \ раз р ^ {I + J + K} [t_1 \ преступник р] [t_2 \ р преступник] [t_3 \ р преступник] \]
Привлечение силы может стать формой выше, он также может быть в \ (O (N) \) искать время
Для \ (\ RM типа = 2 \) , мы рассмотрим перечисление выше \ (\ НОД \)
Set \ (F (A, B, C) \) , чтобы ответить на первый вопрос, то есть, три были взяты к надстрочному \ (A, B, C \ ) Вклад в
Регулярное перечисление \ (\ НОД \) к \ (d \) , что является \ (d \) вклад в кратные
\ [\ Sum_ {d = 1} ^ {мин (А, В, С)} d \ sum_ {d | я} \ му (\ гидроразрыва {я} {d}) F (\ влево \ lfloor \ гидроразрыва {A } {d} \ право \ rfloor, \ влево \ lfloor \ гидроразрыва {B}, {d} \ право \ rfloor, \ влево \ lfloor \ гидроразрыва {C}, {d} \ право \ rfloor) \]
Is \ (\ влево \ lfloor \ гидроразрыва {A} , {d} \ право \ rfloor, \ влево \ lfloor \ гидроразрыва {B} , {d} \ право \ rfloor, \ влево \ lfloor \ гидроразрыва {C} , {d} \ правая \) rfloor \ число умножается на \ (D \) , соответственно, не превышает \ (а, в, с \) , и эти числа \ (\ НОД \) являются \ (D \) или \ (D \) кратные
А затем суммируются для обмена рутинную заказа
\ [\ Sum_ {= 1} ^ {\ мин (А, В, С)} F (\ влево \ lfloor \ гидроразрыва {A}, {я} \ право \ rfloor, \ влево \ lfloor \ гидроразрыва {B}, { я} \ право \ rfloor, \ влево \ lfloor \ гидроразрыва {C}, {я} \ право \ rfloor) \ sum_ {d | я} \ му (\ гидроразрыва {я} {d}) d = \ sum_ {я = 1} ^ {\ мин (А, В, С)} F (\ влево \ lfloor \ гидроразрыва {A}, {я} \ право \ rfloor, \ влево \ lfloor \ гидроразрыва {B}, {я} \ право \ rfloor, \ влево \ lfloor \ гидроразрыва {C}, {я} \ право \ rfloor) \ varphi (я) \]
Прямой блок делится так энергично, сложность не должна превышать \ (О (п \ п Ln ) \)
Это.
Пожалуйста, всегда энергично карты
код
#include<bits/stdc++.h>
#define re register
#define LL long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#pragma GCC optimize(3)
#pragma GCC optimize("-fcse-skip-blocks")
const int maxn=1e5+5;
int mod,P,T,R;
int is[maxn],p[maxn>>1],pre[maxn],phi[maxn],pw[maxn>>1];
int r[2],tax[2][20],pr[2][20];
inline int ksm(int a,int b) {
int S=1;
for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) S=1ll*S*a%mod;
return S;
}
inline int qm(int x) {return x>=P?x-P:x;}
inline int dqm(int x) {return x+=x>>31&P;}
inline int calc(int n,int p) {
return dqm(pre[n]-1ll*pre[n/p]*p%P);
}
inline int out(int A) {
int ans=1;
for(re int i=1;i<=p[0]&&p[i]<=A;i++)
ans=1ll*ans*ksm(p[i],pw[i])%mod;
return ans;
}
inline void clear(int A) {
for(re int i=1;i<=p[0]&&p[i]<=A;i++) pw[i]=0;
}
inline void Solve(int A,int B,int C,int v) {
int ans1=1;
for(re int t=1;t<=p[0];t++) {
if(p[t]>A&&p[t]>B&&p[t]>C) break;
int now=0,tot=0;
for(re int i=0,aa=A;aa;i++,aa/=p[t]) pr[0][i]=tax[0][i]=aa-aa/p[t],r[0]=i;
for(re int j=0,bb=B;bb;j++,bb/=p[t]) pr[1][j]=tax[1][j]=bb-bb/p[t],r[1]=j;
R=max(r[0],r[1]);
for(re int i=1;i<=R;i++) pr[0][i]=qm(pr[0][i]+pr[0][i-1]);
for(re int j=1;j<=R;j++) pr[1][j]=qm(pr[1][j]+pr[1][j-1]);
for(re int i=0;i<=r[0];i++)
now=qm(now+1ll*tax[0][i]*pr[1][i]*i%P);
for(re int j=1;j<=r[1];j++)
now=qm(now+1ll*tax[1][j]*pr[0][j-1]*j%P);
for(re int i=1;i<=R;i++) pr[1][i]=0;
for(re int i=r[0]+1;i<=R;i++) pr[0][i]=0;
now=1ll*now*C%P;
for(re int k=0,cc=C;cc;k++,cc/=p[t]) pr[1][k]=tax[1][k]=cc-cc/p[t],r[1]=k;
R=max(r[0],r[1]);
for(re int i=r[0]+1;i<=R;i++) pr[0][i]=qm(pr[0][i-1]+pr[0][i]);
for(re int k=1;k<=R;k++) pr[1][k]=qm(pr[1][k]+pr[1][k-1]);
for(re int i=1;i<=r[0];i++)
tot=qm(tot+1ll*i*tax[0][i]*dqm(pr[1][r[1]]-pr[1][i-1])%P);
for(re int k=1;k<=r[1];k++)
tot=qm(tot+1ll*k*tax[1][k]*dqm(pr[0][r[0]]-pr[0][k])%P);
for(re int i=0;i<=R;i++) pr[1][i]=pr[0][i]=0;
now=dqm(now-1ll*B*tot%P);
pw[t]=qm(pw[t]+1ll*now*v%P);
}
}
inline int Calc(int n,int m,int h) {
int U=min(min(n,m),h);
for(re int l=2,r;l<=U;l=r+1) {
r=min(n/(n/l),m/(m/l));
r=min(r,h/(h/l));
Solve(n/l,m/l,h/l,dqm(phi[r]-phi[l-1]));
}
return out(max(max(n,m),h));
}
int A,B,C;
int main() {
scanf("%d%d",&T,&mod);P=mod-1;phi[1]=1;
for(re int i=2;i<maxn;i++) {
if(!is[i]) p[++p[0]]=i,phi[i]=i-1;
for(re int j=1;j<=p[0]&&p[j]*i<maxn;j++) {
is[p[j]*i]=1;if(i%p[j]==0) {
phi[p[j]*i]=phi[i]*p[j];break;
}
phi[p[j]*i]=phi[i]*phi[p[j]];
}
}
for(re int i=1;i<maxn;i++)
pre[i]=qm(pre[i-1]+i),phi[i]=qm(phi[i-1]+phi[i]);
while(T--) {
scanf("%d%d%d",&A,&B,&C);
int ans2=1;
for(re int t=1;t<=p[0];t++) {
if(p[t]>A&&p[t]>B&&p[t]>C) break;
int now=0,tot=0;
for(re LL i=0,a=1;a<=A;i++,a*=p[t])
for(re LL j=0,b=1;b<=B;j++,b*=p[t]) {
int v=1ll*max(i,j)*a*b%P;
tot=qm(tot+1ll*v*calc(A/a,p[t])*calc(B/b,p[t])%P*pre[C]%P);
}
for(re LL i=1,a=p[t];a<=A;i++,a*=p[t])
for(re LL k=1,c=p[t];c<=C;k++,c*=p[t]) {
int v=1ll*min(i,k)*a*c%P;
now=qm(now+1ll*v*calc(A/a,p[t])*calc(C/c,p[t])%P*pre[B]%P);
}
ans2=1ll*ans2*ksm(p[t],dqm(tot-now))%mod;
}
Solve(A,B,C,1);printf("%d ",out(max(max(A,B),C)));
printf("%d %d\n",ans2,Calc(A,B,C));clear(max(max(A,B),C));
}
}