zoukankan      html  css  js  c++  java
  • BZOJ2301:[HAOI2011]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

    Solution

    和BZOJ1101一样……只不过简单容斥一下就好了……假设下界为1,答案为$ans_{b,d}-ans_{a-1,d}-ans_{b,c-1}+ans_{a-1,c-1}$

    Code

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #define N (100000+1000)
     5 using namespace std;
     6 
     7 int T,a,b,c,d,k,vis[N],prime[N],sum[N],mu[N],cnt;
     8 
     9 void Get_mu()
    10 {
    11     mu[1]=1;
    12     for (int i=2; i<=50000; ++i)
    13     {
    14         if (!vis[i]){prime[++cnt]=i,mu[i]=-1;}
    15         for (int j=1; j<=cnt && prime[j]*i<=50000; ++j)
    16         {
    17             vis[prime[j]*i]=true;
    18             if (i%prime[j]==0) break;
    19             mu[prime[j]*i]=-mu[i];
    20         }
    21     }
    22     for (int i=1; i<=50000; ++i) sum[i]=sum[i-1]+mu[i];
    23 }
    24 
    25 int Calc(int n,int m)
    26 {
    27     int ans=0; if (n>m) swap(n,m);
    28     for (int l=1,r; l<=n; l=r+1)
    29     {
    30         r=min(n/(n/l),m/(m/l));
    31         ans+=(sum[r]-sum[l-1])*(n/l)*(m/l);
    32     }
    33     return ans;
    34 }
    35 
    36 int main()
    37 {
    38     scanf("%d",&T);
    39     Get_mu();
    40     while (T--)
    41     {
    42         scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
    43         printf("%d
    ",Calc(b/k,d/k)-Calc((a-1)/k,d/k)-Calc(b/k,(c-1)/k)+Calc((a-1)/k,(c-1)/k));
    44     }
    45 }
  • 相关阅读:
    java web 开发入门
    程序优质网站
    为什么要放弃ssh框架
    JDK核心源码(2)
    Linux 格式化分区 报错Could not stat --- No such file or directory 和 partprobe 命令
    快照COW
    磁盘检测SMART工具
    python学习-3.一些常用模块用法
    python 学习2:生成器,迭代器,装饰器
    关于对SwfUpload的改造
  • 原文地址:https://www.cnblogs.com/refun/p/9554132.html
Copyright © 2011-2022 走看看