• 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)


    题目描述

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

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1: 复制
    2
    2 5 1 5 1
    1 5 1 5 2
    输出样例#1: 复制
    14
    3

    说明

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

    莫比乌斯反演

    首先你要会求$sum ^{n}_{i=1}sum ^{m}_{i=1}left[ gcd left( i,j ight) = 1 ight]$

    然后不难发现这题可以容斥处理

    假设$work(i,j)=sum ^{n}_{i=1}sum ^{m}_{i=1}left[ gcd left( i,j ight) = 1 ight]$

    那么$ans=work(b,d)-work(a-1,d)-work(c-1,b)+work(a-1,c-1)$

    // luogu-judger-enable-o2
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int MAXN=1e6+10;
    inline int read()
    {
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int N,a,b,c,d,k,ans;
    int vis[MAXN],prime[MAXN],mu[MAXN],tot=0;
    void GetMu()
    {
        vis[1]=1;mu[1]=1;
        for(int i=2;i<=N;i++)
        {
            if(!vis[i]) prime[++tot]=i,mu[i]=-1;
            for(int j=1;j<=tot&&i*prime[j]<=N;j++)
            {
                vis[i*prime[j]]=1;
                if(i%prime[j]==0) {mu[i*prime[j]]=0;break;}
                else mu[i*prime[j]]=-mu[i];
            }
        }
        
        for(int i=1;i<=N;i++) 
            mu[i]+=mu[i-1];
    }
    int work(int n,int m)
    {
        int limit=min(n/k,m/k),ans=0;
        for(int i=1,nxt;i<=limit;i=nxt+1)
        {
            nxt=min(n/(n/i),m/(m/i));
            ans+=(mu[nxt]-mu[i-1])*(n/(k*i))*(m/(k*i));
        }
        return ans;
    }
    main()
    {
        N=1e5;
        GetMu();
        int QWQ=read();
        while(QWQ--)
        {
            a=read(),b=read(),c=read(),d=read(),k=read();
            ans=work(b,d)-work(a-1,d)-work(c-1,b)+work(a-1,c-1);
            printf("%d
    ",ans);        
        }
        return 0;
    } 
  • 相关阅读:
    js 与 asp.net 验证控件冲突解决方法
    图片处理(给图片加水印)
    JS打开窗口
    ASP.NET编程中的十大技巧
    【ASP.NET】FCKeditor 2.6 + Asp.Net 设置
    XML文件设置树形结构(无限级)原创
    利用vs.net快速开发windows服务(c#) (转载)
    C#反射 学习
    C#解压RAR压缩文件(转载测试通过)
    SQL显示字段信息
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/8537579.html
Copyright © 2020-2023  润新知