• BZOJ 2301 Problem b


    2301: [HAOI2011]Problem b

    Time Limit: 50 Sec  Memory Limit: 256 MB
    Submit: 7576  Solved: 3643
    [Submit][Status][Discuss]

    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

     题解:

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

    思路:在hdu1695的基础上加上容斥,即:ans=solve(b/k,d/k)-solve((a-1)/k,d/k)-solve((c-1)/k,b/k)+solve((a-1)/k,(c-1)/k),详见代码:

    具体见代码:

     1 /**************************************************************
     2     Problem: 2301
     3     User: SongHL
     4     Language: C++
     5     Result: Accepted
     6     Time:10768 ms
     7     Memory:2072 kb
     8 ****************************************************************/
     9  
    10 #include<bits/stdc++.h>
    11 using namespace std;
    12 typedef long long ll;
    13 const int sigma_size=26;
    14 const int N=100+50;
    15 const int MAXN=50000+50;
    16  
    17 int primecnt;
    18 int vis[MAXN],mu[MAXN],prime[MAXN],sum[MAXN];
    19 void Mobius()
    20 {
    21     primecnt=0; mu[1]=1;
    22     memset(vis,0,sizeof(vis));
    23     for(int i=2;i<MAXN;i++)
    24     {
    25         if(!vis[i]) prime[primecnt++]=i,mu[i]=-1;
    26         for(int j=0;j<primecnt && i*prime[j]<MAXN;j++)
    27         {
    28             vis[i*prime[j]]=1;
    29             if(i%prime[j]) mu[i*prime[j]]=-mu[i];
    30             else { mu[i*prime[j]]=0; break; }
    31         }
    32     }
    33 }
    34 ll solve(int l,int r)
    35 {
    36     ll ans=0;
    37     if(l>r) swap(l,r);
    38     int last;
    39     for(int i=1;i<=l;i=last+1)
    40     {
    41         last=min(l/(l/i),r/(r/i));
    42         ans+=(ll)(sum[last]-sum[i-1])*(l/i)*(r/i);
    43     }
    44     return ans;
    45 }
    46 int main()
    47 {
    48     Mobius();
    49     sum[0]=0;
    50     for(int i=1;i<MAXN;i++) sum[i]=sum[i-1]+mu[i];
    51     int T;
    52     scanf("%d",&T);
    53     while(T--)
    54     {
    55         int a,b,c,d,k;
    56         scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
    57         ll ans=solve(b/k,d/k)-solve((a-1)/k,d/k)-solve((c-1)/k,b/k)+solve((a-1)/k,(c-1)/k);
    58         printf("%lld
    ",ans);
    59     }
    60     return 0;
    61 }
    View Code

      

  • 相关阅读:
    [读书笔记]-大话数据结构-4-栈与队列(二)-队列
    [读书笔记]-大话数据结构-4-栈与队列(一)-栈、共享栈和链栈
    [读书笔记]-大话数据结构-3-线性表(二)-线性表的链式存储
    [读书笔记]-大话数据结构-3-线性表(一)-线性表的顺序存储
    [读书笔记]-大话数据结构-2-算法
    [读书笔记]-大话数据结构-1-数据结构绪论
    Linux Shell脚本教程:30分钟玩转Shell脚本编程(笔记)
    scikit-learn学习
    xampp启动遇到的小问题
    选项卡小结
  • 原文地址:https://www.cnblogs.com/csushl/p/9787882.html
Copyright © 2020-2023  润新知