[MtOI2019] Привидение оркестр

титульный

Очень насильственная практика пряной курицы

Учитывая эти два числа \ (\ 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));
    }
}

рекомендация

отwww.cnblogs.com/asuldb/p/11447841.html