【HAOI2011】【BZOJ2301】ProblemB

2301: [HAOI2011]Problem b

Time Limit: 50 Sec Memory Limit: 256 MB

Submit: 1756 Solved: 755

[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

学了反演先来写这个题233

既然在做之前已经知道了是反演,那就往反演那两个函数上想没的说。。。

先用容斥原理,拆分询问来应对下界a,c

设f(i)为gcd(x,y)=i(1≤x≤n,1≤y≤m)的数对数目,

和他对应的F(i)为gcd(x,y)是i的倍数的数对的数目

那么f(i)=∑i|aμ(ai)F(a)=∑i|aμ(ai)?na??ma?

然后就得到了O(n2)的暴力反演

很显然过不了这个题。。。

怎么优化?

我们发现?na?最多有n√个取值

所以?na??ma?最多有

2(n√+m??√)个取值。

因此先对μ维护前缀和

然后在处理四个询问时候都只需要枚举2(n√+m??√)个数而不需要像以前那样暴力枚举了

最后O(nn√)过此题。

枚举除法的取值这种方法在莫比乌斯反演的应用当中非常常用,且代码并不难写//这是PoPoQQQ神犇在课件里的话。

要做好反演的题这种做法也是不可少的呢嗯。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 51000
using namespace std;
int T;
int a,b,c,d,k;
bool not_prime[MAXN];
int num;
int prime[MAXN];
int mu[MAXN]={0,1};
int prev[MAXN];
int F[MAXN],f[MAXN];
void in(int &x)
{
    char ch=getchar();
    x=0;
    while (!(ch>=‘0‘&&ch<=‘9‘)) ch=getchar();
    while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
}
void check_prime()
{
    for (int i=2;i<=50000;i++)
    {
        if(!not_prime[i])
            prime[++num]=i,mu[i]=-1;
        for (int j=1;j<=num&&prime[j]*i<=50000;j++)
        {
            not_prime[i*prime[j]]=1;
            if (i%prime[j]==0)
            {
                mu[i*prime[j]]=0;
                break;
            }
            else
                mu[i*prime[j]]=-mu[i];
        }
    }
}
int getnum(int x,int y)
{
    int last=0,f=0;
    x/=k;y/=k;
    for (int i=1;i<=min(x,y);i=last+1)
    {
        last=min(x/(x/i),y/(y/i));
        f+=(prev[last]-prev[i-1])*(x/i)*(y/i);
    }
    return f;
}
int main()
{
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    check_prime();
    for (int i=1;i<=50000;i++) prev[i]=prev[i-1]+mu[i];
    in(T);
    while (T--)
    {
        in(a);in(b);in(c);in(d);in(k);
        a--;c--;
        int ans=0;
        ans=getnum(b,d)-getnum(a,d)-getnum(c,b)+getnum(a,c);
        printf("%d\n",ans);
    }
}
时间: 2024-10-06 01:15:07

【HAOI2011】【BZOJ2301】ProblemB的相关文章

【HAOI2011】向量

题目描述: 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y). 说明:这里的拼就是使得你选出的向量之和为(x,y) 输入格式: 第一行数组组数t,(t<=50000) 接下来t行每行四个整数a,b,x,y (-2*10^9<=a,b,x,y<=2*10^9) 输出格式: t行每行为Y或者为N,分别表示可以拼出来,不能拼出来 分析: 我们看

【Windows10&nbsp;IoT开发系列】配置篇

原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry Pi.MinnowBoard和Galileo平台上的核心版.本文重点针对Raspberry Pi平台的Windwos10 IoT配置做介绍. Windows 10 IoT Editions ​一:设置你的电脑. 注:​开发Windows10 IoT的电脑需要Visual Studio 2015.

【Windows10&nbsp;IoT开发系列】PowerShell的相关配置

原文:[Windows10 IoT开发系列]PowerShell的相关配置 可使用 Windows PowerShell 远程配置和管理任何 Windows 10 IoT 核心版设备.PowerShell 是基于任务的命令行 Shell 和脚本语言,专为进行系统管理而设计. 1.​启动 PowerShell (PS) 会话 注:若要使用装有Windows10 IoT Core设备启动PS会话,首先需要在主机电脑与设备之间创建信任关系. ​启动 Windows IoT 核心版设备后,与该设备相连的

【Windows10&nbsp;IoT开发系列】API&nbsp;移植工具

原文:[Windows10 IoT开发系列]API 移植工具 Windows 10 IoT Core 中是否提供你的当前 Win32 应用程序或库所依赖的 API? 如果不提供,是否存在可使用的等效 API? 此工具可以为你回答这些问题,并协助你将你的当前 Win32 应用程序和库迁移到 Windows IoT Core. Windows 10 IoT 核心版 API 移植工具可在 ms-iot/iot-utilities github 存储库中找到.下载存储库 zip 并将 IoTAPIPor

【Windows10&nbsp;IoT开发系列】“Hello,World!”指导

原文:[Windows10 IoT开发系列]"Hello,World!"指导 本文主要是介绍使用C#来开发一个可以运行在Raspberry Pi2上的一个基本项目. ​1.在启动Visual Studio 2015后,选择"文件"→"新建项目". ​在打开的"新建项目"对话框中,选择"通用". ​选择第一个项目"空白应用(通用Windows)" 新建项目 ​注:如果这是你创建的第一个项

【opencv入门之二】感兴趣区域ROI,线性混合addWeighted

参考网站: http://blog.csdn.net/poem_qianmo/article/details/20911629 1.感兴趣区域ROI //[2]定义一个Mat类型并给其设定ROI区域 Mat imageROI = srcImage1( Rect(200, 250, logoImage.cols, logoImage.rows )); //[3]加载掩摸(必须是灰度图) Mat mask = imread( "dota_logo.jpg", 0 ); //[4]将掩摸拷贝

【Windows10&nbsp;IoT开发系列】Powershell命令行实用程序

原文:[Windows10 IoT开发系列]Powershell命令行实用程序 更新帐户密码: 强烈建议你更新默认的管理员帐户密码.若要更新帐户密码,你可以发出以下命令: net user Administrator [new password]​ (其中 [new password] 表示你选择的强密码). 创建本地用户帐户: 如果你想要授予其他人访问你的 Windows IoT Core 设备的权限,你可以通过在 net user [username] [password] /add​ 中键

【python之路35】网络编程之socket相关

Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: fil

【ASP.NET实战教程】ASP.NET实战教程大集合,各种项目实战集合

[ASP.NET实战教程]ASP.NET实战教程大集合,各种项目实战集合,希望大家可以好好学习教程中,有的比较老了,但是一直很经典!!!!论坛中很多小伙伴说.net没有实战教程学习,所以小编连夜搜集整理出一些比较好的教程,望君好好珍惜,资源不易,且保持,且珍惜直接上资源截图: 下载地址[回复可见]:http://www.fu83.cn/thread-282-1-1.html 感觉文章写的好,一定要回复 推荐哦!!!

20150218【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进Poll定时查询]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 按键驱动程序中,如果不使用read函数中使程序休眠的,而是还是使用查询方式的话,可以使用Poll函数,来控制一定时间内,如果有按键发生,则立即返回键值. 同时,poll也可以同时监控多个(比如说按键,鼠标,等)一旦发生事件则立即返回. 我们在linux查看帮助: 从帮助中的说明得知, poll, ppoll - wait for some event on a file descrip