一道莫比乌斯反演入门题。

首先观察题目要求:的数对数

首先可以发现,这个东西同时有上界和下界,所以并不是很容易计算

那么我们变下形,可以看到:原式=

是不是清晰很多了?(当然没有!)

不,这一步很重要的目的在于消去了下界,使得我们的计算更方便了。

而且可以发现这四个式子的形式是一样的,所以我们对一个式子进行研究就可以了。

那么问题就变成了这样:

求满足的数对数

那么我们再进行研究,可以发现:如果有gcd(i,j)==k,那么一定有gcd(i/k,j/k)==1!

于是我们用i/k替代i,j/k替代j,原式就变为求的数对数

接下来我们考虑计算方法:

首先,如果两个式子的上界相等,则可以直接利用欧拉函数计算

但很不幸的是,上界并不相等,所以我们需要换一种方法做。

接下来进行一些推导:

设数论函数为单位元函数(即),那么可以立刻得到:

基于这一点,我们把上面的[gcd(i,j)==1]进行变形可得:

原式=

这样的话,实际我们只是在研究对于每个d,被统计了多少次!

这样问题就变得简单了:我只需统计对于每个d,有多少个i和j同时是d的倍数即可

而我们知道,在[1,n]范围内,数d的倍数的个数=[n/d]

因此原式立刻变成了:

(注意这里的上界应该是n/k,m/k中较小者)

按理说算到这里就差不多了,可以直接O(n)出解,但是这道毒瘤题居然有多组询问!

这样考虑询问的个数的话时间是不够的。

于是我们还需要优化。

很幸运的是,我们发现表达式中有[n/kd][m/kd]这两个东西

我们知道,对于两个数n,m,在x∈[1,min(n,m)]范围内,[n/x]*[m/x]的取值个数是根号级别的!

这样的话我们只需找出所有这些取值(很显然每一个取值的取等区间都是连续的),然后对应地乘上莫比乌斯函数的前缀和就可以了!

贴代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
int T;
int pri[50005];
bool used[50005];
int miu[50005];
int smiu[50005];
int cnt=0;
int a,b,c,d,k;
void init()
{
miu[1]=1;
for(int i=2;i<=50000;i++)
{
if(!used[i])
{
pri[++cnt]=i;
miu[i]=-1;
}
for(int j=1;j<=cnt&&i*pri[j]<=50000;j++)
{
used[i*pri[j]]=1;
if(i%pri[j]==0)
{
miu[i*pri[j]]=0;
break;
}
miu[i*pri[j]]=-miu[i];
}
}
for(int i=1;i<=50000;i++)
{
smiu[i]=smiu[i-1]+miu[i];
}
}
ll solve(ll x,ll y)
{
ll ans=0;
if(x>y)
{
swap(x,y);
}
x/=k,y/=k;
int last=0;
for(int i=1;i<=x;i=last+1)
{
last=min(x/(x/i),y/(y/i));
ans+=(smiu[last]-smiu[i-1])*(x/i)*(y/i);
}
return ans;
}
int main()
{
scanf("%d",&T);
init();
while(T--)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
printf("%lld\n",solve(b,d)-solve(a-1,d)-solve(b,c-1)+solve(a-1,c-1));
}
return 0;
}

bzoj 2301的更多相关文章

  1. 【莫比乌斯反演】关于Mobius反演与gcd的一些关系与问题简化(bzoj 2301 Problem b&&bzoj 2820 YY的GCD&&BZOJ 3529 数表)

    首先我们来看一道题  BZOJ 2301 Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd( ...

  2. [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)

    [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...

  3. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  4. bzoj 2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...

  5. BZOJ 2301 Problem b

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 冬令营听了莫比乌斯,这就是宋老师上课讲的例题咯[今天来实现一下] #include& ...

  6. BZOJ 2301 Problem b(莫比乌斯函数)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2301 题意:每次给出a,b,c,d,K.求有多少数对(x,y)满足a<=x< ...

  7. BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1007  Solved: 415[Submit][ ...

  8. BZOJ 2301 Problem B(莫比乌斯反演)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2301 题意:给a,b,c,d,k,求gcd(x,y)==k的个数(a<=x<=b,c&l ...

  9. BZOJ 2301: [HAOI2011]Problem b( 数论 )

    和POI某道题是一样的...  http://www.cnblogs.com/JSZX11556/p/4686674.html 只需要二维差分一下就行了. 时间复杂度O(MAXN + N^1.5) - ...

  10. BZoj 2301 Problem b(容斥定理+莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 7732  Solved: 3750 [Submi ...

随机推荐

  1. (6)Java数据结构-- 转:JAVA常用数据结构及原理分析

    JAVA常用数据结构及原理分析  http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balab ...

  2. Fresco,Glide,Picasso

    1.Picasso和Glide的with后面的参数不同 Picasso.with(这里只能传入上下文)     . Glide.with,后面可以传入上下文,Application实例,Activit ...

  3. 使用Numpy将数据集中的data和target同时shuffle

    假设现在有图像数据imgs和对应标签targets.数据维度分别如下 imgs.shape = (num, channel, width, height) targets.shape = (num, ...

  4. 前端-----css(1)

    css概述 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. css知识点 注释 /* 注释内容 */ css四 ...

  5. 识别oracle数据库软件版本号

    由于Oracle数据库不断发展并可能需要维护,因此Oracle会定期生成新版本.并非所有客户最初都订阅新版本或需要对其现有版本进行特定维护.因此,该产品的多个版本同时存在. 可能需要多达五个数字才能完 ...

  6. Python 面向对象【1】

    对象 = 属性 + 方法   面向对象特征:分装 继承 多态[不同对象对同一方法响应不同行动]   类定义 class xxx: .... ....   类对象 类对象支持两种操作:属性引用和实例化 ...

  7. Python-有关文件操作,函数调用几道练习:

    1.写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 2.写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数 3.写函数,判断用户传入的对象(字符串. ...

  8. Linux内核的整体架构简介

    1. 前言 本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的目录结构,并和各个软 ...

  9. Python os.access() 方法

    概述 os.access() 方法使用当前的uid/gid尝试访问路径.大部分操作使用有效的 uid/gid, 因此运行环境可以在 suid/sgid 环境尝试. 语法 access()方法语法格式如 ...

  10. docker拉取镜像报错:net/http: TLS handshake timeout.

    docker拉取镜像报错:net/http: TLS handshake timeout. 启动一个后台的busybox容器 [yunva@node1 network-scripts]$ docker ...