Bzoj P2301 [HAOI2011]Problem b___莫比乌斯反演+容斥

题目大意:

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

1 ≤ n ≤ 50000 , 1 ≤ a ≤ b ≤ 50000 1≤n≤50000,1≤a≤b≤50000 1n500001ab50000
1 ≤ c ≤ d ≤ 50000 , 1 ≤ k ≤ 50000 1≤c≤d≤50000,1≤k≤50000 1cd500001k50000

分析:

d x , y d_{x,y} dx,y表示 ∑ i = 1 x ∑ j = 1 y [ g c d ( i , j ) = k ] \sum_{i=1}^{x}\sum_{j=1}^{y}[gcd(i,j)=k] i=1xj=1y[gcd(i,j)=k]
那答案容斥一下可以知道就是 d b , d − d a − 1 , d − d b , c − 1 + d a − 1 , c − 1 d_{b,d}-d_{a-1,d}-d_{b,c-1}+d_{a-1,c-1} db,dda1,ddb,c1+da1,c1
那么我们考虑求 d x , y d_{x,y} dx,y
d x , y d_{x,y} dx,y
= ∑ i = 1 x ∑ j = 1 y g c d ( i , j ) = k \sum_{i=1}^{x}\sum_{j=1}^{y}gcd(i,j)=k i=1xj=1ygcd(i,j)=k
= ∑ i = 1 ⌊ x k ⌋ ∑ j = 1 ⌊ y k ⌋ [ g c d ( i , j ) = 1 ] =\sum_{i=1}^{\left \lfloor \frac{x}{k} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{y}{k} \right \rfloor}[gcd(i,j)=1] =i=1kxj=1ky[gcd(i,j)=1]
我们知道莫比乌斯函数有一个性质,
∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}μ(d)=[n=1] dnμ(d)=[n=1]
那么当 g c d ( i , j ) = 1 gcd(i,j)=1 gcd(i,j)=1时,
显然 ∑ d ∣ g c d ( i , j ) μ ( d ) = 1 \sum_{d|gcd(i,j)}μ(d)=1 dgcd(i,j)μ(d)=1
那么
∑ i = 1 ⌊ x k ⌋ ∑ j = 1 ⌊ y k ⌋ [ g c d ( i , j ) = 1 ] \sum_{i=1}^{\left \lfloor \frac{x}{k} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{y}{k} \right \rfloor}[gcd(i,j)=1] i=1kxj=1ky[gcd(i,j)=1]
就可以写成
= ∑ i = 1 ⌊ x k ⌋ ∑ j = 1 ⌊ y k ⌋ ∑ d ∣ g c d ( i , j ) μ ( d ) =\sum_{i=1}^{\left \lfloor \frac{x}{k} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{y}{k} \right \rfloor} \sum_{d|gcd(i,j)}μ(d) =i=1kxj=1kydgcd(i,j)μ(d)
然后这个东西可以转换一下,安利一个博客,
https://www.cnblogs.com/NaVi-Awson/p/8318709.html
在这里插入图片描述
然后我们对于所有的 ⌊ n k d ⌋ \left \lfloor \frac{n}{kd} \right \rfloor kdn,可以发现取值最多只有 n \sqrt{n} n 种,并且相同的都是连续的一段,那么我们就可以愉快的预处理出 m o b i u s mobius mobius函数的前缀和,然后分块处理 ⌊ n k d ⌋ \left \lfloor \frac{n}{kd} \right \rfloor kdn,就可以求出 = ∑ i = 1 ⌊ x k ⌋ ∑ j = 1 ⌊ y k ⌋ ∑ d ∣ g c d ( i , j ) μ ( d ) =\sum_{i=1}^{\left \lfloor \frac{x}{k} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{y}{k} \right \rfloor} \sum_{d|gcd(i,j)}μ(d) =i=1kxj=1kydgcd(i,j)μ(d),就可以让每次查询的复杂度都达到根号级别。

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define N 50005
 
using namespace std;
 
typedef long long ll;
 
int prime[N], check[N], sum[N], mu[N], T, a, b, c, d, k, cnt;
 
void Get_mobius()
{
    mu[1] = 1;
    for (int i = 2; i <= 50000; i++)
    {
         if (!check[i])
         {
             prime[++cnt] = i;
             mu[i] = -1;
         }
         for (int j = 1; j <= cnt; j++)
         {
              if (prime[j] * i > 50000) break;
              check[prime[j] * i] = 1;
              if (i % prime[j] == 0) { mu[prime[j] * i] = 0; break; }
                                else mu[prime[j] * i] = - mu[i];
         }
    }
    for (int i = 1; i <= 50000; i++) sum[i] = sum[i - 1] + mu[i];
}
 
ll Cal(int x, int y) 
{
    ll num = 0;
    if (x > y) swap(x, y);
    for (int i = 1, last; i <= x; i = last + 1)
    {
         last = min(x / (x / i), y / (y / i));
         num += (ll)(sum[last] - sum[i - 1]) * (x  / i) * (y / i);
    }
    return num;
}
 
int main()
{
    Get_mobius();
    scanf("%d", &T);
    while (T--)
    {
           scanf("%d %d %d %d %d", &a, &b, &c, &d, &k);
           ll ans = Cal(b / k, d / k) - Cal((a - 1) / k, d / k) - Cal(b / k, (c - 1) / k) + Cal((a - 1) / k, (c - 1) / k);
           printf("%lld\n", ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值