题解 P6384 『MdOI R2』Quo Vadis

传送门


【分析】

规定三个求和项:

\(\displaystyle Sum_1(n)=\sum_{i=1}^ni={n(n+1)\over 2}\)

\(\displaystyle Sum_2(n)=\sum_{i=1}^ni^2={n(n+1)(2n+1)\over 6}\)

\(\displaystyle Sum_3(n)=\sum_{i=1}^ni^3=({n(n+1)\over 2})^2=Sum^2_1(n)\)

关于操作 \(4\) ,是否进行高斯消元并无影响,故放置后文进行分析

高斯消元之前,对于操作 \(2\) 有:

\(\displaystyle\quad\sum_{i=1}^x\sum_{j=1}^xA_{ij}\)

\(\displaystyle=\sum_{i=1}^x\sum_{j=1}^xij\gcd(i,j)\)

\(\displaystyle=\sum_{i=1}^x\sum_{j=1}^xij\sum_{d\mid i\wedge d\mid j}\boldsymbol \varphi(d)\)

\(\displaystyle=\sum_{d=1}^x(\boldsymbol{id}^2\cdot \boldsymbol \varphi)(d)\sum_{i=1}^{x/d}i\sum_{j=1}^{x/d}j\)

\(\displaystyle=\sum_{d=1}^x(\boldsymbol{id}^2\cdot \boldsymbol \varphi)(d)\cdot Sum_3(x/d)\)

前半部分会达到 \(10^8\) ,因此需要使用杜教筛:

\(\boldsymbol f=\boldsymbol {id}^2\cdot \boldsymbol \varphi,\boldsymbol g=\boldsymbol {id}^2,\boldsymbol h=\boldsymbol f*\boldsymbol g=\boldsymbol {id}^3\)

\(\displaystyle H(n)=\sum_{i=1}^n\boldsymbol h(i)=\sum_{i=1}^n\sum_{d\mid i}\boldsymbol f(d)\boldsymbol g({i\over d})=\sum_{d=1}^n\boldsymbol g(d)\sum_{i=1}^{n/d}\boldsymbol f(i)=\sum_{d=1}^n\boldsymbol g(d)F(n/d)=\sum_{d=2}^n\boldsymbol g(d)F(n/d)+F(n)\)

\(\displaystyle F(n)=H(n)-\sum_{d=2}^n\boldsymbol g(d)F(n/d),H(n)=Sum_3(n),G(n)=Sum_2(n)\)


现考虑高斯消元后的形式:

先给出结论:\(\{ij\gcd(i,j)\}\to\{ij\boldsymbol \varphi(i)\cdot [i\mid j]\}\)

证明放在后文,现考虑其他部分:

\(2\) 操作直接分类讨论:\(\begin{cases} ij\boldsymbol \varphi(i),i\mid j \\ 0,i\nmid j \end{cases}\)

\(4\) 操作由线性代数的知识得到:\(\displaystyle \det B=\prod_{i=1}^x[i\cdot i\cdot \boldsymbol \varphi(i)]=\prod_{i=1}^x\boldsymbol f(i)=Pf(x)\)

\(3\) 操作我们可以很容易列出式子:\(\displaystyle \sum_{i=1}^x\sum_{j=1}^xij\boldsymbol \varphi(i)\cdot [i\mid j]=\sum_{i=1}^x\sum_{i\mid j}ij\boldsymbol \varphi(i)\)

调换顺序,枚举 \(j:\displaystyle \sum_{j=1}^xj\sum_{i\mid j}i\boldsymbol \varphi(i)=\sum_{j=1}^x(\boldsymbol {id}\cdot \boldsymbol \varphi*\boldsymbol I\cdot \boldsymbol {id})(j)\)

所以,记 \(\boldsymbol g=\boldsymbol {id}\cdot \boldsymbol \varphi*\boldsymbol I\cdot \boldsymbol {id}\) 则答案为 \(G(x)\)

由于 \(\boldsymbol g\) 是积性函数,考虑如何欧拉筛:

\(\displaystyle (\boldsymbol {id}\cdot \boldsymbol \varphi*\boldsymbol I)(p^k)=\sum_{i=0}^k(\boldsymbol {id}\cdot \boldsymbol \varphi)(p^i)=\sum_{i=1}^kp^i\cdot p^{i-1}\cdot (p-1)+1={p\over p+1}\cdot (p^{2k}-1)+1\)

欧拉筛的时候,除了维护数字 \(n\) 的最小质因数 \(fc_n\) ,同时维护最小值因数的 出现次数 次方 \(pk_n\)

\(\displaystyle (\boldsymbol {id}\cdot \boldsymbol \varphi*\boldsymbol I)(n\times p)=\begin{cases} (\boldsymbol {id}\cdot \boldsymbol \varphi*\boldsymbol I)(n)\cdot (\boldsymbol {id}\cdot \boldsymbol \varphi*\boldsymbol I)(p),p\nmid n \\ (\boldsymbol {id}\cdot \boldsymbol \varphi*\boldsymbol I)(n)\cdot ({fc_n\over fc_n+1}\cdot (pk_n^2-1)+1)^{-1}\cdot ({fc_{n\times p}\over fc_{n\times p}+1}\cdot (pk_{n\times p}^2-1)+1),p\mid n \end{cases}\)

最后 \(\displaystyle \boldsymbol g(n)=\displaystyle (\boldsymbol {id}\cdot \boldsymbol \varphi*\boldsymbol I)(n)\cdot n\)


【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=5e6+10,MOD=998244353;
int Fc[MAXN],Prime[MAXN],CntPrime,Phi[MAXN],F[MAXN],PF[MAXN],G[MAXN],PK[MAXN];
inline ll fpow(ll a,ll x) { ll ans=1; for(;x;x>>=1,a=a*a%MOD) if(x&1) ans=ans*a%MOD; return ans; }
inline ll inv(ll a) { return fpow(a,MOD-2); }
inline int add(int a,int b) { return (a+b>=MOD)?(a+b-MOD):(a+b); }
inline int dis(int a,int b) { return (a-b<0)?(a-b+MOD):(a-b); }
inline void sieve(){
    Phi[1]=G[1]=1;
    for(int i=2;i<=5e6;++i){
        if(!Fc[i]){
            Fc[i]=Prime[++CntPrime]=i;
            Phi[i]=i-1;
            PK[i]=i;
            G[i]=((ll)i*i-i+1+MOD)%MOD;
        }
        for(int j=1;j<=CntPrime;++j)
            if(Prime[j]*i>5e6||Prime[j]>Fc[i]) break;
            else if(Prime[j]==Fc[i]) {
                PK[Prime[j]*i]=PK[i]*Prime[j];
                Fc[Prime[j]*i]=Prime[j];
                Phi[Prime[j]*i]=Phi[i]*Prime[j];
                
                ll tmp=Prime[j]*inv(Prime[j]+1)%MOD;
                ll tmp0=tmp*((ll)PK[i]*PK[i]%MOD-1)%MOD+1;
                ll tmp1=tmp*((ll)PK[Prime[j]*i]*PK[Prime[j]*i]%MOD-1)%MOD+1;
                G[Prime[j]*i]=G[i]*inv(tmp0)%MOD*tmp1%MOD;
            }
            else{
                PK[Prime[j]*i]=Prime[j];
                Fc[Prime[j]*i]=Prime[j];
                Phi[Prime[j]*i]=Phi[i]*(Prime[j]-1);
                G[Prime[j]*i]=(ll)G[Prime[j]]*G[i]%MOD;
            }
    }
    PF[0]=1;
    for(int i=1;i<=5e6;++i){
        G[i]=((ll)G[i]*i+G[i-1])%MOD;
        F[i]=(ll)Phi[i]*i%MOD*i%MOD;
        PF[i]=(ll)PF[i-1]*F[i]%MOD;
        F[i]=add(F[i],F[i-1]);
    }
}

bool app;
unordered_map<ll,int> sumf;
const int inv2=(MOD+1>>1),inv6=(MOD+1)/6;
inline int sum1(int n) { return (ll)inv2*n%MOD*(n+1)%MOD; }
inline int sum2(int n) { return (ll)inv6*n%MOD*(n+1)%MOD*(n<<1|1)%MOD; }
inline int sum3(int n) { int res=(ll)inv2*n%MOD*(n+1)%MOD; return (ll)res*res%MOD; }
inline int getf(int n){
    if(n<=5e6) return F[n];
    if(sumf.count(n)) return sumf[n];
    int res=sum3(n);
    for(register int l=2,r;l<=n;l=r+1){
        r=n/(n/l);
        res=dis( res , (sum2(r)-sum2(l-1)+(ll)MOD)*getf(n/l)%MOD );
    }
    return sumf[n]=res;
}
inline int ans(int x){
    if(app) return G[x];
    int res=0;
    for(register int l=1,r;l<=x;l=r+1){
        r=x/(x/l);
        res=add( res , sum3(x/l)*(getf(r)-getf(l-1)+(ll)MOD)%MOD );
    }
    return res;
}
int main(){
    sieve();
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    ll M,opt,x,y; cin>>M;
    while(M--&&cin>>opt){
        if(opt!=1) cin>>x;
        if(opt==2) cin>>y;
        if(opt==1) app=1;
        else if(opt==2) cout<<( app? (y%x?0:x%MOD*(y%MOD)%MOD*Phi[x]%MOD) : (x%MOD*(y%MOD)%MOD*(__gcd(x,y)%MOD)%MOD) )<<"\n";
        else if(opt==3) cout<<ans(x)<<"\n";
        else if(opt==4) cout<<PF[x]<<"\n";
    }
    cout.flush();
    return 0;
}

【证明】

证明分为两步:

  1. 证明矩阵 \(A,B\) 若满足 \(b_{ij}=ija_{ij}\) ,则分别对其高斯消元后得到 \(A',B'\) ,仍满足 \(b'_{ij}=ija'_{ij}\)

  2. 证明矩阵 \(\{\gcd(i,j)\}\) 高斯消元后得到 \(\{\boldsymbol \varphi(i)\cdot [i\mid j]\}\)

关于 \(1\) ,记 \(\Lambda = \text{diag}(1,2,3,\cdots )\)\(\Lambda^{-1}=\text{diag}(1,2^{-1},3^{-1},\cdots )\)

\(B=\Lambda A\Lambda\)

设高斯消元的矩阵为 \(G\) ,即 \(A'=GA,B'=GB\)

不难发现,\(G\) 为一系列初等矩阵相乘得出的,记为 \(G=\prod_i E_i\)

因为 \((\Lambda\cdot E_i)^{-1}=\Lambda^{-1}\cdot E_i^{-1}\)

\(\Lambda\) 与各个 \(E_i\) 都是可交换的

\(\displaystyle \therefore \Lambda G=\Lambda \prod_iE_i=E_1\Lambda\prod_{i>1}E_i=\cdots =\prod_i E_i\Lambda=G\Lambda\)

因此得出:\(GB=G\Lambda A\Lambda=\Lambda GA\Lambda\)

这表明,先将 \(A\) 去除 \(ij\) ,再高斯消元,最后再乘回去;和直接高斯消元是等价的

由此证明结论 \(1\)


现假设前 \((i-1)\) 行高斯消元后满足该结论

则第 \(i\) 行减去 \(d\)\((d\mid i)\) 得到:

\(\displaystyle a'_{ij}=\gcd(i,j)-\sum_{d\mid \gcd(i,j)\wedge d<i}\boldsymbol \varphi(i)=\gcd(i,j)-\sum_{d\mid \gcd(i,j)}\boldsymbol \varphi(i)+[\gcd(i,j)=i]\cdot \boldsymbol \varphi(i)=\gcd(i,j)-\gcd(i,j)+[i\mid j]\cdot \boldsymbol \varphi(i)=\boldsymbol \varphi(i)\cdot [i\mid j]\)

\(j<i\)\(i\nmid j\to a'_{ij}=0\)

并且 \(j=i\)\(i\mid j\to a'_{ij}=\boldsymbol \varphi(i)\)

成功消出 \(i\) 行的上三角矩阵,且仍然满足结论

由数学归纳法,显然可证:矩阵 \(\{\gcd(i,j)\}\) 高斯消元后得到 \(\{\boldsymbol \varphi(i)\cdot [i\mid j]\}\)


所以先取出 \(ij\) ,高斯消元得到 \(a'_{ij}=\boldsymbol \varphi(i)\cdot [i\mid j]\) ,再算回去得到 \(b'_{ij}=ij\boldsymbol \varphi(i)\cdot [i\mid j]\)

因此,原结论得证

posted @ 2021-03-07 15:51  JustinRochester  阅读(107)  评论(0编辑  收藏  举报