BZOJ2301[HAOI2011] Problem b

原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2301

Problem b

Description

对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。

Input

第一行一个整数n,接下来n行每行五个整数,分别表示a、b、c、d、k

Output

共n行,每行一个整数表示满足要求的数对(x,y)的个数

Sample Input

2
2 5 1 5 1
1 5 1 5 2

Sample Output

14
3

HINT

100%的数据满足:1≤n≤50000,1≤a≤b≤50000,1≤c≤d≤50000,1≤k≤50000

题解

我们可以很容易就能推出下面的式子:

ans=i=1aj=1b[gcd(i,j)=d] a n s = ∑ i = 1 a ∑ j = 1 b [ g c d ( i , j ) = d ]

ans=k=1min(n,m)μ(k)adkbdk a n s = ∑ k = 1 m i n ( n , m ) μ ( k ) ⌊ a d k ⌋ ⌊ b d k ⌋

如果你觉得不是很容易,右转进入ZAP-Queries

那么我们已经可以求出 1a,1b 1 ∼ a , 1 ∼ b 的答案了,但题目要求是 ab,cd a ∼ b , c ∼ d ,我们可以用简单的容斥来解决这个问题:

直接计算 1b,1d 1 ∼ b , 1 ∼ d 时,我们会多算 1a1,1d 1 ∼ a − 1 , 1 ∼ d 1c1,1b 1 ∼ c − 1 , 1 ∼ b 这一部分,要将其减掉;同时,我们就多减掉了 1a1,1b1 1 ∼ a − 1 , 1 ∼ b − 1 ,把这一部分加回来,我们就得到了正确答案。

代码
#include<bits/stdc++.h>
#define R register int
#define ll long long
using namespace std;
const int M=5e4+5,N=5e4;
int miu[M],p[M],n;
bool check[M];
void getmiu()
{
    miu[1]=check[1]=1;
    R i,j,t;
    for(i=2;i<=N;++i)
    {
        if(!check[i])p[++p[0]]=i,miu[i]=-1;
        for(j=1;j<=p[0];++j)
        {
            t=i*p[j];
            if(t>N)break;
            check[t]=1;
            if(i%p[j]==0){miu[t]=0;break;}
            miu[t]=-miu[i];
        }
        miu[i]+=miu[i-1];
    }
}
ll f(int a,int b,int k)
{
    a/=k,b/=k;
    if(a>b)swap(a,b);
    ll ans=0;R l,r;
    for(l=1;l<=a;l=r+1)r=min(a/(a/l),b/(b/l)),ans+=1ll*(miu[r]-miu[l-1])*(a/l)*(b/l);
    return ans;
}
void in(){getmiu();scanf("%d",&n);}
void ac(){R a,b,c,d,k,i;for(i=1;i<=n;++i)scanf("%d%d%d%d%d",&a,&b,&c,&d,&k),printf("%lld\n",f(b,d,k)+f(a-1,c-1,k)-f(a-1,d,k)-f(c-1,b,k));}
int main()
{
    in();ac();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值