Prefix Sum

上套路

  • 反演
    F(n)=dnf(d)=>f(n)=dnμ(d)F(nd)F(n)=\sum\limits_{d|n}f(d)=>f(n)=\sum\limits_{d|n}\mu(d)F(\frac{n}d)
    F(n)=ndf(d)=>f(n)=ndμ(dn)F(d)F(n)=\sum\limits_{n|d}f(d)=>f(n)=\sum\limits_{n|d}\mu(\frac{d}n)F(d)

  • μϕ\mu與\phi
    dnμ(d)=[n==1]\sum\limits_{d|n}\mu(d)=[n==1]
    dnϕ(d)=n\sum\limits_{d|n}\phi(d)=n
    ϕ(n)n=dnμ(d)d\frac{\phi(n)}{n}=\sum\limits_{d|n}\frac{\mu(d)}{d}
    ϕ(n)=dnμ(d)nd\phi(n)=\sum\limits_{d|n}\mu(d)\frac{n}{d}

  • σ\sigma約數和
    σ(n)=dnd\sigma(n)=\sum\limits_{d|n}d
    i=1nσ(i)=i=1nini\sum\limits_{i=1}^{n}\sigma(i)=\sum\limits_{i=1}^ni*\left \lfloor \frac{n}{i} \right \rfloor
    σk(ij)=xinyjn[gcd(x,y)==1]xkjk/yk\sigma_k(i*j)=\sum\limits_{x|i}^n\sum\limits_{y|j}^n[gcd(x,y)==1]x^k*j^k/y^k
    k0k等於0就是約數個數和

  • 杜教篩
    g1S(n)=i=1nh(i)i=2ng(i)S(ni)g_1S(n)=\sum\limits_{i=1}^nh(i)-\sum\limits_{i=2}^ng(i)S(\left \lfloor \frac{n}{i} \right \rfloor)
    h=fgh=f*g
    i=1ni2=n(n+1)(2n+1)6\sum\limits_{i=1}^n{i^2}=\frac{n(n+1)(2n+1)}{6}
    i=1ni3=(n(n+1)2)2\sum\limits_{i=1}^n{i^3}=(\frac{n(n+1)}{2})^2

  • gcd(anbn,ambm)=agcd(n,m)bgcd(n,m)gcd(a^n-b^n,a^m-b^m)=a^{gcd(n,m)}-b^{gcd(n,m)}
    gcd(an1,am1)=agcd(n,m)1gcd(a^n-1,a^m-1)=a^{gcd(n,m)}-1

  • gcd(Fibm,Fibn)=Fibgcd(n,m)gcd(Fib_m,Fib_n)=Fib_{gcd(n,m)}

  • i=1n1ij=1ilcm(i,j)=12(d=1ni=1ndiϕ(i)+n)\sum\limits_{i=1}^n\frac{1}{i}\sum\limits_{j=1}^{i}lcm(i,j)=\frac{1}{2}(\sum\limits_{d=1}^n\sum\limits_{i=1}^{\frac{n}{d}}i\phi(i)+n)

51Nod 1244 - 莫比烏斯函數之和

51Nod 1239 - 歐拉函數之和

51Nod 1237 - 最大公約數之和 V3

51Nod 1238 - 最小公倍數之和 V3

51Nod 1227 - 平均最小公倍數

51Nod 1220 - 約數之和

HDU 6706 - huntian oy

洛谷 P2257 - YY的GCD

51Nod 1244 - 莫比烏斯函數之和

回目錄

杜教篩,h=μgh=\mu*g捲上恆等函數I(n),g=1I(n),即g=1
i=1nh(i)=1\sum\limits_{i=1}^nh(i)=1
S(n)=1i=2nS(ni)S(n)=1-\sum\limits_{i=2}^nS(\left \lfloor \frac{n}{i} \right \rfloor)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e6+9;
int su[N],mu[N],num,vis[N];
unordered_map<LL,LL> mp;
void init()
{
    mu[1]=1;
    for(int i=2;i<N;++i){
        if(!vis[i])su[++num]=i,mu[i]=-1;
        for(int j=1;j<=num&&i*su[j]<N;++j){
            vis[i*su[j]]=1;
            if(i%su[j]==0)break;
            mu[i*su[j]]=-mu[i];
        }
    }
    for(int i=1;i<N;++i)mu[i]+=mu[i-1];
}
LL djs(LL n)
{
    if(n<N)return mu[n];
    if(mp[n])return mp[n];
    LL ans=1;
    for(LL L=2,R;L<=n;L=R+1){
        R=n/(n/L);
        ans-=(R-L+1)*djs(n/L);
    }
    return mp[n]=ans;
}
int main()
{
    init();
    LL L,R;
    scanf("%lld%lld",&L,&R);
    printf("%lld\n",djs(R)-djs(L-1));
    return 0;
}

51Nod 1239 - 歐拉函數之和

回目錄

杜教篩,h=ϕgh=\phi*g捲上恆等函數I(n),g=1,h(n)=nI(n),即g=1,則h(n)=n
i=1nh(i)=(nn+1)/2\sum\limits_{i=1}^nh(i)=(n*n+1)/2
S(n)=(nn+1)/2i=2nS(ni)S(n)=(n*n+1)/2-\sum\limits_{i=2}^nS(\left \lfloor \frac{n}{i} \right \rfloor)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e6+9;
int su[N],phi[N],num,vis[N];
unordered_map<LL,LL> mp;
const LL mod=1e9+7;
const LL inv2=500000004;
void init()
{
    phi[1]=1;
    for(int i=2;i<N;++i){
        if(!vis[i])su[++num]=i,phi[i]=i-1;
        for(int j=1;j<=num&&i*su[j]<N;++j){
            vis[i*su[j]]=1;
            if(i%su[j]==0){
                phi[i*su[j]]=phi[i]*su[j];
                break;
            }
            phi[i*su[j]]=phi[i]*phi[su[j]];
        }
    }
    for(int i=1;i<N;++i)phi[i]=(phi[i]+phi[i-1])%mod;
}
LL sum(LL n)
{
    n%=mod;
    return n*(n+1)%mod*inv2%mod;
}
LL djs(LL n)
{
    if(n<N)return phi[n];
    if(mp[n])return mp[n];
    LL ans=sum(n);
    for(LL L=2,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans-(R-L+1)%mod*djs(n/L)%mod+mod)%mod;
    }
    return mp[n]=ans;
}
int main()
{
    init();
    LL n;
    scanf("%lld",&n);
    printf("%lld\n",djs(n));
    return 0;
}

51Nod 1237 - 最大公約數之和 V3

回目錄

i=1nj=1ngcd(i,j)=i=1nj=1ndgcd(i,j)ϕ(d)=d=1nϕ(d)i=1nj=1n[dgcd(i,j)]=d=1nϕ(d)i=1ndj=1nd1=d=1nϕ(d)ni2\begin{aligned}\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j) &=\sum\limits_{i=1}^n\sum\limits_{j=1}^n\sum\limits\limits_{d|gcd(i,j)}\phi(d)\\ &=\sum\limits_{d=1}^n\phi(d)\sum\limits_{i=1}^n\sum\limits_{j=1}^n[d|gcd(i,j)]\\ &=\sum\limits_{d=1}^n\phi(d)\sum\limits_{i=1}^{\frac{n}d}\sum\limits_{j=1}^{\frac{n}d}1\\ &=\sum\limits_{d=1}^n\phi(d){\left \lfloor \frac{n}{i} \right \rfloor}^2\\ \end{aligned}

杜教篩加分塊即可

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e6+9;
int su[N],phi[N],num,vis[N];
unordered_map<LL,LL> mp;
const LL mod=1e9+7;
const LL inv2=500000004;
void init()
{
    phi[1]=1;
    for(int i=2;i<N;++i){
        if(!vis[i])su[++num]=i,phi[i]=i-1;
        for(int j=1;j<=num&&i*su[j]<N;++j){
            vis[i*su[j]]=1;
            if(i%su[j]==0){
                phi[i*su[j]]=phi[i]*su[j];
                break;
            }
            phi[i*su[j]]=phi[i]*phi[su[j]];
        }
    }
    for(int i=1;i<N;++i)phi[i]=(phi[i]+phi[i-1])%mod;
}
LL sum(LL n)
{
    n%=mod;
    return n*(n+1)%mod*inv2%mod;
}
LL djs(LL n)
{
    if(n<N)return phi[n];
    if(mp[n])return mp[n];
    LL ans=sum(n);
    for(LL L=2,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans-(R-L+1)%mod*djs(n/L)%mod+mod)%mod;
    }
    return mp[n]=ans;
}
LL outside(LL n)
{
    LL ans=0;
    for(LL L=1,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans+(djs(R)-djs(L-1)+mod)%mod*((n/L)%mod)*((n/L)%mod)+mod)%mod;
    }
    return ans;
}
int main()
{
    init();
    LL n;
    scanf("%lld",&n);
    printf("%lld\n",outside(n));
    return 0;
}

51Nod 1238 - 最小公倍數之和 V3

回目錄

i=1nj=1nlcm(i,j)=d=1ni=1nj=1nijd[d==gcd(i,j)]=d=1ndi=1nj=1nij[1==gcd(i,j)]=d=1ndi=1ndi2ϕ(i)\begin{aligned}\sum\limits_{i=1}^n\sum\limits_{j=1}^nlcm(i,j) &=\sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^n\frac{ij}{d}[d==gcd(i,j)] \\ &=\sum\limits_{d=1}^nd\sum\limits_{i=1}^n\sum\limits_{j=1}^nij[1==gcd(i,j)]\\ &=\sum\limits_{d=1}^nd\sum\limits_{i=1}^{\frac{n}d}i^2\phi(i)\\ \\ \end{aligned}

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e6+9;
const LL mod=1e9+7;
const LL inv2=500000004;
const LL inv6=166666668;
int su[N],num,vis[N];
LL phi[N];
unordered_map<LL,LL> mp;
void init()
{
    phi[1]=1;
    for(int i=2;i<N;++i){
        if(!vis[i])su[++num]=i,phi[i]=i-1;
        for(int j=1;j<=num&&i*su[j]<N;++j){
            vis[i*su[j]]=1;
            if(i%su[j]==0){
                phi[i*su[j]]=phi[i]*su[j];
                break;
            }
            phi[i*su[j]]=phi[i]*phi[su[j]];
        }
    }
    for(int i=1;i<N;++i)phi[i]=(phi[i]*i%mod*i%mod+phi[i-1])%mod;
}
LL sum(LL n)
{
    n%=mod;
    return n*(n+1)%mod*inv2%mod;
}
LL get(LL n)
{
    n%=mod;
    return n*(n+1)%mod*(2*n+1)%mod*inv6%mod;
}
LL djs(LL n)
{
    if(n<(LL)N)return phi[n];
    if(mp[n])return mp[n];
    LL ans=sum(n);
    ans=ans*ans%mod;
    for(LL L=2,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans-(get(R)-get(L-1)+mod)%mod*djs(n/L)%mod+mod)%mod;
    }
    return mp[n]=ans;
}
LL outside(LL n)
{
    LL ans=0;
    for(LL L=1,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans+(sum(R)-sum(L-1)+mod)%mod*djs(n/L)%mod+mod)%mod;
    }
    return ans;
}
int main()
{
    init();
    LL n;
    scanf("%lld",&n);
    printf("%lld\n",outside(n));
    return 0;
}

51Nod 1227 - 平均最小公倍數

回目錄

i=1n1ij=1ilcm(i,j)=d=1ni=1nj=1ijd[d==gcd(i,j)]=d=1ni=1nj=1i[1==gcd(i,j)]=d=1ni=1ndiϕ(i)+[i==1]2=d=1ni=1niϕ(i)+n2\begin{aligned}\sum\limits_{i=1}^n\frac{1}{i}\sum\limits_{j=1}^ilcm(i,j) &=\sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^i\frac{j}{d}[d==gcd(i,j)] \\ &=\sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^i[1==gcd(i,j)]\\ &=\sum\limits_{d=1}^n\sum\limits_{i=1}^{\frac{n}d}\frac{i\phi(i)+[i==1]}{2}\\ &=\frac{\sum\limits_{d=1}^n\sum\limits_{i=1}^ni\phi(i)+n}{2}\\ \\ \end{aligned}

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e6+9;
const LL mod=1e9+7;
const LL inv2=500000004;
const LL inv6=166666668;
int su[N],num,vis[N];
LL phi[N];
unordered_map<LL,LL> mp;
void init()
{
    phi[1]=1;
    for(int i=2;i<N;++i){
        if(!vis[i])su[++num]=i,phi[i]=i-1;
        for(int j=1;j<=num&&i*su[j]<N;++j){
            vis[i*su[j]]=1;
            if(i%su[j]==0){
                phi[i*su[j]]=phi[i]*su[j];
                break;
            }
            phi[i*su[j]]=phi[i]*phi[su[j]];
        }
    }
    for(int i=1;i<N;++i)phi[i]=(phi[i]*i%mod+phi[i-1])%mod;
}
LL sum(LL n)
{
    n%=mod;
    return n*(n+1)%mod*inv2%mod;
}
LL get(LL n)
{
    n%=mod;
    return n*(n+1)%mod*(2*n+1)%mod*inv6%mod;
}
LL djs(LL n)
{
    if(n<(LL)N)return phi[n];
    if(mp[n])return mp[n];
    LL ans=get(n);
    for(LL L=2,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans-(sum(R)-sum(L-1)+mod)%mod*djs(n/L)%mod+mod)%mod;
    }
    return mp[n]=ans;
}
LL outside(LL n)
{
    LL ans=0;
    for(LL L=1,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans+(R-L+1+mod)%mod*djs(n/L)%mod+mod)%mod;
    }
    return (ans+n)%mod*inv2%mod;
}
int main()
{
    init();
    LL n,m;
    scanf("%lld%lld",&n,&m);
    printf("%lld\n",(outside(m)-outside(n-1)+mod)%mod);
    return 0;
}

51Nod 1220 - 約數之和

回目錄

i=1nj=1id(i,j)=i=1nj=1nxiyjxjy[1==gcd(x,y)]=d=1nμ(d)i=1nj=1nxiyjxjy[dgcd(x,y)]=d=1nμ(d)di=1ndj=1ndxiyjxjy=d=1nμ(d)di=1ndxixj=1ndyjjy=d=1ndμ(d)(i=1ndσ(i))2=d=1ndμ(d)(i=1ndindi)2\begin{aligned}\sum\limits_{i=1}^n\sum\limits_{j=1}^id(i,j) &=\sum\limits_{i=1}^n\sum\limits_{j=1}^n\sum\limits_{x|i}\sum\limits_{y|j}\frac{xj}{y}[1==gcd(x,y)] \\ &=\sum\limits_{d=1}^n\mu(d)\sum\limits_{i=1}^n\sum\limits_{j=1}^n\sum\limits_{x|i}\sum\limits_{y|j}\frac{xj}{y}[d|gcd(x,y)] \\ &=\sum\limits_{d=1}^n\mu(d)d\sum\limits_{i=1}^{\frac{n}d}\sum\limits_{j=1}^{\frac{n}d}\sum\limits_{x|i}\sum\limits_{y|j}\frac{xj}{y}\\ &=\sum\limits_{d=1}^n\mu(d)d\sum\limits_{i=1}^{\frac{n}d}\sum\limits_{x|i}x\sum\limits_{j=1}^{\frac{n}d}\sum\limits_{y|j}\frac{j}{y}\\ &=\sum\limits_{d=1}^nd\mu(d)(\sum\limits_{i=1}^{\frac{n}d}\sigma(i))^2\\ &=\sum\limits_{d=1}^nd\mu(d)(\sum\limits_{i=1}^{\frac{n}d}i{\left \lfloor \frac{n}{di} \right \rfloor})^2\\ \\ \end{aligned}

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e6+9;
const LL mod=1e9+7;
const LL inv2=500000004;
const LL inv6=166666668;
int su[N],num,vis[N],mu[N];
unordered_map<int,LL> mp;
void init()
{
    mu[1]=1;
    for(int i=2;i<N;++i){
        if(!vis[i])su[++num]=i,mu[i]=-1;
        for(int j=1;j<=num&&i*su[j]<N;++j){
            vis[i*su[j]]=1;
            if(i%su[j]==0)break;
            mu[i*su[j]]=-mu[i];
        }
    }
    for(int i=1;i<N;++i)mu[i]=(mu[i]*i+mu[i-1]+mod)%mod;
}
LL sum(int n)
{
    return (LL)n*(n+1)%mod*inv2%mod;
}
LL djs(int n)
{
    if(n<N)return mu[n];
    if(mp[n])return mp[n];
    LL ans=1;
    for(int L=2,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans-(sum(R)-sum(L-1)+mod)%mod*djs(n/L)%mod+mod)%mod;
    }
    return mp[n]=ans;
}
LL inside(int n)
{
    LL ans=0;
    for(int L=1,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans+(sum(R)-sum(L-1)+mod)%mod*(n/L)%mod+mod)%mod;
    }
    return ans*ans%mod;
}
LL outside(int n)
{
    LL ans=0;
    for(int L=1,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans+(djs(R)-djs(L-1)+mod)%mod*inside(n/L)%mod+mod)%mod;
    }
    return ans;
}
int main()
{
    init();
    int n;
    scanf("%d",&n);
    printf("%lld\n",outside(n));
    return 0;
}

HDU 6706 - huntian oy

回目錄

i=1nj=1igcd(iaja,ibjb)[gcd(i,j)==1]=i=1nj=1i(ij)[gcd(i,j)==1]=i=1nj=1ii[gcd(i,j)==1]i=1nj=1ij[gcd(i,j)==1]=i=1niϕ(i)i=1niϕ(i)+[n==1]2=1+i=2niϕ(i)(1+i=2niϕ(i)2)=i=2niϕ(i)2=i=1niϕ(i)12\begin{aligned}\sum\limits_{i=1}^n\sum\limits_{j=1}^igcd(i^a-j^a,i^b-j^b)[gcd(i,j)==1] &=\sum\limits_{i=1}^n\sum\limits_{j=1}^i(i-j)[gcd(i,j)==1] \\ &=\sum\limits_{i=1}^n\sum\limits_{j=1}^ii[gcd(i,j)==1]- \sum\limits_{i=1}^n\sum\limits_{j=1}^ij[gcd(i,j)==1]\\ &=\sum\limits_{i=1}^ni\phi(i)-\frac{\sum\limits_{i=1}^ni\phi(i)+[n==1]}{2}\\ &=1+\sum\limits_{i=2}^ni\phi(i)-(1+\frac{\sum\limits_{i=2}^ni\phi(i)}{2})\\ &=\frac{\sum\limits_{i=2}^ni\phi(i)}{2}\\ &=\frac{\sum\limits_{i=1}^ni\phi(i)-1}{2}\\ \\ \end{aligned}

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e6+9;
const LL mod=1e9+7;
const LL inv2=500000004;
const LL inv6=166666668;
int su[N],num,vis[N];
LL phi[N];
unordered_map<int,LL> mp;
void init()
{
    phi[1]=1;
    for(int i=2;i<N;++i){
        if(!vis[i])su[++num]=i,phi[i]=i-1;
        for(int j=1;j<=num&&i*su[j]<N;++j){
            vis[i*su[j]]=1;
            if(i%su[j]==0){
                phi[i*su[j]]=phi[i]*su[j];
                break;
            }
            phi[i*su[j]]=phi[i]*phi[su[j]];
        }
    }
    for(int i=1;i<N;++i)phi[i]=(phi[i]*i%mod+phi[i-1]+mod)%mod;
}
LL sum(int n)
{
    return (LL)n*(n+1)%mod*inv2%mod;
}
LL djs(int n)
{
    if(n<N)return phi[n];
    if(mp[n])return mp[n];
    LL ans=(LL)n*(n+1)%mod*(2*n+1)%mod*inv6%mod;
    for(int L=2,R;L<=n;L=R+1){
        R=n/(n/L);
        ans=(ans-(sum(R)-sum(L-1)+mod)%mod*djs(n/L)%mod+mod)%mod;
    }
    return mp[n]=ans;
}
int main()
{
    init();
    int n,T,a,b;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&a,&b);
        printf("%lld\n",(djs(n)-1+mod)%mod*inv2%mod);
    }
    return 0;
}

洛谷 P2257 - YY的GCD

回目錄

pprimei=1nj=1n[gcd(i,j)==p]=pprimei=1npj=1np[gcd(i,j)==1]=pprimed=1min(np,mp)μ(d)i=1npj=1np[dgcd(i,j)]=pprimed=1min(np,mp)μ(d)i=1npdj=1npd1=pprimed=1min(np,mp)μ(d)npdmpd\begin{aligned}\sum\limits_{p\in prime}\sum\limits_{i=1}^n\sum\limits_{j=1}^n[gcd(i,j)==p] &=\sum\limits_{p\in prime}\sum\limits_{i=1}^{\frac{n}{p}}\sum\limits_{j=1}^{\frac{n}{p}}[gcd(i,j)==1]\\ &=\sum\limits_{p\in prime}\sum\limits_{d=1}^{min(\frac{n}{p},\frac{m}{p})}\mu(d)\sum\limits_{i=1}^{\frac{n}{p}}\sum\limits_{j=1}^{\frac{n}{p}}[d|gcd(i,j)]\\ &=\sum\limits_{p\in prime}\sum\limits_{d=1}^{min(\frac{n}{p},\frac{m}{p})}\mu(d)\sum\limits_{i=1}^{\frac{n}{pd}}\sum\limits_{j=1}^{\frac{n}{pd}}1\\ &=\sum\limits_{p\in prime}\sum\limits_{d=1}^{min(\frac{n}{p},\frac{m}{p})}\mu(d){\left \lfloor \frac{n}{pd} \right \rfloor}{\left \lfloor \frac{m}{pd} \right \rfloor}\\ \\ \end{aligned}
T=pd令T=pd
pprimed=1min(np,mp)μ(d)npdmpd=T=1min(n,m)nTmTtT,tprimeμ(Tt)\begin{aligned}\sum\limits_{p\in prime}\sum\limits_{d=1}^{min(\frac{n}{p},\frac{m}{p})}\mu(d){\left \lfloor \frac{n}{pd} \right \rfloor}{\left \lfloor \frac{m}{pd} \right \rfloor} &=\sum\limits_{T=1}^{min(n,m)}{\left \lfloor \frac{n}{T} \right \rfloor}{\left \lfloor \frac{m}{T} \right \rfloor}\sum\limits_{t|T,t\in prime}\mu(\frac{T}{t}) \\ \end{aligned}

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e7+9;
const LL mod=1e9+7;
const LL inv2=500000004;
const LL inv6=166666668;
int mu[N],mm[N],su[N],num;
bool vis[N];
void init()
{
    mu[1]=1;
    for(int i=2;i<N;++i){
        if(!vis[i])su[++num]=i,mu[i]=-1;
        for(int j=1;j<=num&&i*su[j]<N;++j){
            vis[i*su[j]]=1;
            if(i%su[j]==0)break;
            mu[i*su[j]]=-mu[i];
        }
    }
    for(int i=1;i<=num;++i)
        for(int j=1;su[i]*j<N;++j)mm[su[i]*j]+=mu[j];
    for(int i=1;i<N;++i)mm[i]+=mm[i-1];
}

LL outside(int n,int m)
{
    LL ans=0;
    for(int L=1,R;L<=n;L=R+1){
        R=min(n/(n/L),m/(m/L));
        ans+=(LL)(n/L)*(m/L)*(mm[R]-mm[L-1]);
    }
    return ans;
}
int main()
{
    init();
    int T,n,m;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        if(n>m)swap(n,m);
        printf("%lld\n",outside(n,m));
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章