BZOJ2301:[HAOI2011]Problem b

来源:互联网 发布:学生怒骂日本记者知乎 编辑:程序博客网 时间:2024/06/18 12:00

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

题目传送门
就像之前讲过的bzoj1695一样(注意他不一定是从1开始的),用分块加速,学会推公式,莫比乌斯反演翻来倒去也就那么点东西。维护一个区间~~记得清空数组。

#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;const int maxn=1000000;typedef long long ll;bool check[maxn+10];int primes[maxn+10];int mu[maxn+10];//表示系数ll Sum[10000005],Pre[10000005]; void get_Mobius()  {      int pnum=0;      memset(check,true,sizeof(check));      memset(Sum,0,sizeof(Sum));      mu[1]=1;      Sum[1]=1;      for(int i=2;i<maxn;i++)      {          if(check[i])          {              primes[pnum++]=i;              mu[i]=-1;          }          for(int j=0;j<pnum&&i*primes[j]<maxn;j++)          {              check[i*primes[j]]=false;              if(i%primes[j]==0)              {                  mu[i*primes[j]]=0;                  break;              }              mu[i*primes[j]]=-mu[i];          }          Sum[i]=Sum[i-1]+mu[i];      }  }  /*只要让F(t)=满足gcd(x,y)%t==0的数对个数 f(t)=满足gcd(x,y)=t的数对个数,则F(t)和f(t)就存在莫比乌斯反演的关系了。显然F(t)=(b/t)*(d/t) 因为如果gcd(x,y)=1,则gcd(x?k,y?k)=k,所以我们把b和d同时除以k,得到的f(1)再去重就是答案。令lim=min(b/k,d/k),就根据我给出的莫比乌斯反演第二个公式, */int find(int x,int y){    if(x>y)swap(x,y);    ll re=0;int j;    for(int i=1,j=0;i<=x;i=j+1)    {        j=min(x/(x/i),y/(y/i));        re+=(long long)(Sum[j]-Sum[i-1])*(x/i)*(y/i);    }    return re;}int main(){    int T;    int a,b,c,d,k;    get_Mobius();    scanf("%d",&T);    for(int ii=1;ii<=T;ii++)    {        scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);        if(k==0)        {            printf("0\n");            continue;        }        long long ans=0;        ans=find(b/k,d/k)-find((a-1)/k,d/k)-find((c-1)/k,b/k)+find((a-1)/k,(c-1)/k);        printf("%lld\n",ans);    }    return 0;}

by_lmy

原创粉丝点击