码迷,mamicode.com
首页 > 其他好文 > 详细

[HAOI2011]Problem b

时间:2019-05-11 16:02:12      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:lin   函数   mat   prim   int   oid   rac   std   inline   

洛咕

题意:给定\(a,b,c,d,k\),求\(\sum_{x=a}^{b}\sum_{y=c}^{d}[gcd(x,y)==k]\)

按照套路,设

\(f(k)=\sum_{i=a}^{b}\sum_{j=c}^{d}[gcd(a,b)==k]\)

\(F(k)=\sum_{k|x}f(x)\)

\(F(k)\)式子是指在\(a\)\(b\)\(c\)\(d\)中各选出一个数,使得它们的\(gcd\)\(k\)的倍数,故\(F(k)=(\lfloor\frac bk\rfloor-\lfloor\frac {a-1}k\rfloor)(\lfloor\frac dk\rfloor-\lfloor\frac {c-1}k\rfloor)\)

又由莫比乌斯反演定理得,\(f(k)=\sum_{k|x}μ(\frac xk)F(x)\)

\(f(k)=\sum_{k|x}μ(\frac xk)(\lfloor\frac bx\rfloor-\lfloor\frac {a-1}x\rfloor)(\lfloor\frac dx\rfloor-\lfloor\frac {c-1}x\rfloor)\)

\(ans=f(k)=\sum_{x=1}^{min(\lfloor\frac bk\rfloor,\lfloor\frac dk\rfloor)}μ(x)(\lfloor\frac b{kx}\rfloor-\lfloor\frac {a-1}{kx}\rfloor)(\lfloor\frac d{kx}\rfloor-\lfloor\frac {c-1}{kx}\rfloor)\)

预处理出\(μ\)函数,整除分块计算即可.

#include<bits/stdc++.h>
using namespace std;
inline int read(){
   int s=0,w=1;char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
   return s*w;
}
const int N=50005;
int v[N],prime[N],mu[N],sum[N];
inline void get_mu(){
    mu[1]=1;int m=0;
    for(int i=2;i<=50000;i++){
        if(!v[i]){
            v[i]=i;
            prime[++m]=i;
            mu[i]=-1;
        }
        for(int j=1;j<=m;j++){
            if(i*prime[j]>50000)break;
            v[i*prime[j]]=prime[j];
            if(i%prime[j]==0)break;
            mu[i*prime[j]]=-mu[i];
        }
    }
    for(int i=1;i<=50000;i++)sum[i]=sum[i-1]+mu[i];
}
int main(){
    get_mu();
    int n=read();
    while(n--){
        int a=read(),b=read(),c=read(),d=read(),k=read(),ans=0;
        a--;c--;a/=k;b/=k;c/=k;d/=k;
        if(b>d)swap(b,d),swap(a,c);
        for(int l=1,r;l<=b;l=r+1){
            r=min(b/(b/l),d/(d/l));
            if(a/l)r=min(r,a/(a/l));
            if(c/l)r=min(r,c/(c/l));
            ans+=(b/l-a/l)*(d/l-c/l)*(sum[r]-sum[l-1]);
        }
        printf("%d\n",ans);
    }
    return 0;
}

[HAOI2011]Problem b

标签:lin   函数   mat   prim   int   oid   rac   std   inline   

原文地址:https://www.cnblogs.com/PPXppx/p/10848739.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!