BZOJ P2301 [HAOI2011] Problem b【莫比乌斯】

f(n,m)=i=1nj=1m(gcd(i,j)==k)

=i=1nkj=1mk(gcd(i,j)==1)

=i=1nkj=1mkd|i,d|jμ(d)

=d|i,d|jμ(d)i=1nkj=1mk

=d=1min(nk,mk)μ(d)i=1ndkj=1mdk

=d=1min(nk,mk)μ(d)ndkmdk

Ans=f(b,d)+f(a1,c1)f(a1,b)f(b,c1)

由于直接计算f时间复杂度仍然高,但是结合μ(d)的性质我们发现其实可以对μ(d)做一个前缀和优化一下。

void Mobius(){
    ......
}
LL GetAns(LL N,LL M,LL K){
    LL I,Ans=0,Last;
    N/=K,M/=K;
    if(N>M){
        swap(N,M);
    }
    for(I=1;I<=N;I=Last+1){
        Last=min(N/(N/I),M/(M/I));
        Ans+=(Miu[J]-Miu[I-1])*(N/I)*(M/I);
    }
    return Ans;
}
int main(){
    LL I,J,K;
    N=Read();Mobius();
    for(I=1;I<=N;I++){
        A=Read(),B=Read(),C=Read(),D=Read(),K=Read();
        Ans=GetAns(B,D,K)-GetAns(A-1,D,K)-GetAns(B,C-1,K)+GetAns(A-1,C-1,K);
        ......
    }   
    return 0;
}
发布了339 篇原创文章 · 获赞 455 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览