[SDOI2015]约数个数和【莫比乌斯反演】

[SDOI2015]约数个数和
题意:\(d(x)\)\(x\)的约数个数,求\(\sum_{i=1}^n\sum{j=1}^md(ij)\)
由结论得\[ans=\sum_{i=1}^n\sum_{j=1}^m\sum_{x|i}\sum_{y|j}[GCD(x,y)==1]\]
我们换个方向,考虑\(x, y\)的贡献,则 \[ans=\sum_{x=1}^n\sum_{y=1}^m\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor[GCD(x, y)==1]\]
\[f(d)=\sum_{x=1}^n\sum_{y=1}^m\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor[GCD(x, y)==d]\]
\[g(d)=\sum_{d|n}f(d)\]
\[=\sum_{x=1}^n\sum_{y=1}^m\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor[d|GCD(x, y)]\]
\[=\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{n}{xd}\rfloor\lfloor\frac{m}{yd}\rfloor\]
\[=(\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{n}{xd}\rfloor)(\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{m}{yd}\rfloor)\]
\[f(d)=\sum_{d|n}\mu(\frac{n}{d})g(n)\]
\(ans=f(1)=\sum_{d=1}^n\mu(d)g(d)\)
\(sum(n)=\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\)
\(ans=\sum_{d=1}^n\mu(d)*sum(\lfloor\frac{n}{d}\rfloor)*sum(\lfloor\frac{m}{d}\rfloor)\)
不开\(O_2\)\(T\)掉两个点

void init(){
    miu[1]=1;
    for(int i=2; i < Maxn; i++){
        if(!p[i]) p[++ptot]=i, miu[i]=-1;
        for(int j=1, x; j <= ptot && (x=i*p[j]) < Maxn; j++){
            p[x]=1; if(i%p[j] == 0) break; miu[x]=-miu[i];
        }
    }
    for(int i=1; i < Maxn; i++) for(int l=1, r=0; r < i; l=r+1) 
            r=i/(i/l), sum[i]+=1ll*(r-l+1)*(i/l);
    for(int i=1; i < Maxn; i++) miu[i]+=miu[i-1];
}
void solve(){
    int T=read(); init();
    while(T--){
        ll n=read(), m=read(), ans=0; if(n > m) swap(n, m);
        for(int l=1, r=0; r < n; l=r+1){
            r=min(n/(n/l), m/(m/l));
            ans+=(miu[r]-miu[l-1])*sum[n/l]*sum[m/l];
        }
        printf("%lld\n", ans);
    }
}

猜你喜欢

转载自www.cnblogs.com/zerolt/p/9296358.html
今日推荐