zoukankan      html  css  js  c++  java
  • [HAOI2011]Problem b

    2301: [HAOI2011]Problem b

    http://www.lydsy.com/JudgeOnline/problem.php?id=2301

    Time Limit: 50 Sec  Memory Limit: 256 MB

    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

    bzoj 1101: [POI2007]Zap这个题套上容斥原理

    http://www.cnblogs.com/TheRoadToTheGold/p/6609495.html

    ans=solve(b,d,k)-solve(b,c-1,k)-solve(a-1,d,k)+solve(a-1,c-1,k)

    #include<cstdio>
    #include<algorithm>
    #define N 50001
    using namespace std;
    int prime[N],cnt,mul[N];
    long long sum[N];
    bool v[N];
    void mobius()
    {
        mul[1]=1;
        for(int i=2;i<N;i++)
        {
            if(!v[i])
            {
                v[i]=true;
                prime[++cnt]=i;
                mul[i]=-1;
            }
            for(int j=1;j<=cnt;j++)
            {
                if(prime[j]*i>N-1) break;
                v[prime[j]*i]=true;
                if(i%prime[j]==0)
                {
                    mul[i*prime[j]]=0;
                    break;
                }
                else mul[i*prime[j]]=-mul[i];
            }
        }
    }
    long long solve(long long n,long long m,int k)
    {
        n/=k;m/=k;
        int h=min(n,m),j,ans=0;
        for(int i=1;i<=h;i=j+1)
        {
            j=min(n/(n/i),m/(m/i));//???分块 
            ans+=(n/i)*(m/i)*(sum[j]-sum[i-1]);
        }
       return ans;
    }
    int main()
    {
        int t,a,b,c,d,k;
        long long ans;
        scanf("%d",&t);
        mobius();
        for(int i=1;i<N;i++) sum[i]=sum[i-1]+mul[i];
        while(t--)
        {
            scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
            ans=solve(b,d,k)-solve(b,c-1,k)-solve(a-1,d,k)+solve(a-1,c-1,k);
            printf("%lld
    ",ans);
        }
    }
  • 相关阅读:
    python Flask基础使用
    安装docker以及常规操作
    关于InfiniBand几个基本知识点解释
    RDMA技术解析
    C++学习之 类
    C++学习 内存模型和名称空间
    C++基础知识(3)
    C++基础知识(2)
    C++基础知识(1)
    Java基础知识
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6610748.html
Copyright © 2011-2022 走看看