Mophues(莫比乌斯反演+分段)

PDF.js实现分片加载问题 PDF.js实现分片加载问题。 阅读详情

Mophues

 As we know, any positive integer C ( C >= 2 ) can be written as the multiply of some prime numbers:
    C = p1×p2× p3× ... × pk
which p1, p2 ... pk are all prime numbers.For example, if C = 24, then:
    24 = 2 × 2 × 2 × 3
    here, p1 = p2 = p3 = 2, p4 = 3, k = 4

Given two integers P and C. if k<=P( k is the number of C's prime factors), we call C a lucky number of P.

Now, XXX needs to count the number of pairs (a, b), which 1<=a<=n , 1<=b<=m, and gcd(a,b) is a lucky number of a given P ( "gcd" means "greatest common divisor").

Please note that we define 1 as lucky number of any non-negative integers because 1 has no prime factor. 

Input
The first line of input is an integer Q meaning that there are Q test cases.
Then Q lines follow, each line is a test case and each test case contains three non-negative numbers: n, m and P (n, m, P <= 5×10 5. Q <=5000).
Output
For each test case, print the number of pairs (a, b), which 1<=a<=n , 1<=b<=m, and gcd(a,b) is a lucky number of P.
Sample Input

2
10 10 0
10 10 1

Sample Output

63
93
题意:

1≤x,y≤n 1 ≤ x , y ≤ n ,求 gcd(x,y) g c d ( x , y ) 分解后质因数个数小于等于k的 (x,y) ( x , y ) 的对数

分析:

这道题依然是莫比乌斯反演的套路,但是说实话,却是要比其他类型的难理解,也难以想到


首先我们先回顾一下,目前已经做到的过的莫比乌斯反演题目的问法和解法

1)求 x∈[1,n],y∈[1,m] x ∈ [ 1 , n ] , y ∈ [ 1 , m ] 内 gcd(x,y)=1的数对个数 g c d ( x , y ) = 1 的 数 对 个 数

直接套用莫比乌斯反演公式

f(1)=∑1|dμ(d)F(d)=∑1|dμ(d)nd⋅md f ( 1 ) = ∑ 1 | d μ ( d ) F ( d ) = ∑ 1 | d μ ( d ) n d ⋅ m d

2)求 x∈[1,n],y∈[1,m] x ∈ [ 1 , n ] , y ∈ [ 1 , m ] 内 gcd(x,y)=k的数对个数 g c d ( x , y ) = k 的 数 对 个 数

转换成求 gcd(xk,yk)=1 g c d ( x k , y k ) = 1 的数对个数,问题变成类型 1)

3)求 x∈[1,n],y∈[1,m] x ∈ [ 1 , n ] , y ∈ [ 1 , m ] 内 gcd(x,y)=素数的数对个数 g c d ( x , y ) = 素 数 的 数 对 个 数

这个问题稍微复杂些

实际上求 gcd(x,y)=p g c d ( x , y ) = p 的数对个数仍然可以转化成求 gcd(xp,yp)=1 g c d ( x p , y p ) = 1 的数对个数

只不过外层还需要套一层for循环来枚举素数

即

ans=∑pmin(n,m)∑1|dmin(n,m)npd⋅mpd a n s = ∑ p m i n ( n , m ) ∑ 1 | d m i n ( n , m ) n p d ⋅ m p d

但是这样的时间复杂度比较高

因此通过化简我们令 t=pd t = p d

得到

ans=∑t=1min(n,m)nt⋅mt∑p|tμ(tp) a n s = ∑ t = 1 m i n ( n , m ) n t ⋅ m t ∑ p | t μ ( t p )

这样可以设 a[t]=∑p|tμ(tp) a [ t ] = ∑ p | t μ ( t p ) ,完全可以进行预处理,在根据 nt⋅mt n t ⋅ m t 向下取整的特性,完全可以分段,因而进一步优化,此类型的例题可查看Primes in GCD Table SPOJ - PGCD(莫比乌斯反演+分段)


以上三种类型是我目前学习莫比乌斯反演做到过的三种类型的题目,而今天这道题目,和类型3)的解法有很大的相似之处,下面详细解释

仍然是相同的套路设

f(d):满足gcd(x,y)=d的数对的个数 f ( d ) : 满 足 g c d ( x , y ) = d 的 数 对 的 个 数

F(d):满足gcd(x,y)=d及其倍数的数对的个数 F ( d ) : 满 足 g c d ( x , y ) = d 及 其 倍 数 的 数 对 的 个 数

显然有 F(x)=⌊nx⌋⋅⌊mx⌋ F ( x ) = ⌊ n x ⌋ ⋅ ⌊ m x ⌋

反演后得到

f(n)=∑n|dμ(dn)⋅⌊nn⌋⋅⌊mn⌋ f ( n ) = ∑ n | d μ ( d n ) ⋅ ⌊ n n ⌋ ⋅ ⌊ m n ⌋
(后面都是整数除法向下取整,省略不再写向下取整号)

如果我们枚举最大公因数 g g (注意类比题目类型3),枚举素数p)

我们同样得到

ans=∑gmin(m,n)∑g|dμ(d)⋅ngd⋅mgd a n s = ∑ g m i n ( m , n ) ∑ g | d μ ( d ) ⋅ n g d ⋅ m g d

继续类比设 t=g⋅d,则d=tg t = g ⋅ d , 则 d = t g

ans=∑t=1min(n,m)nt⋅mt∑g|tμ(tg) a n s = ∑ t = 1 m i n ( n , m ) n t ⋅ m t ∑ g | t μ ( t g )

同样可以预处理出 ∑g|tμ(tg) ∑ g | t μ ( t g ) ,并且由于向下取整也可以分段来进行优化。


好!到目前为之,我相信大家一定会有一个疑问,上面推导分析的这一堆和题目有什么关系???

题目的条件是最大公因数 g的素因子的个数小于等于k g 的 素 因 子 的 个 数 小 于 等 于 k

仔细观察上面的推导我们发现实际上问题已经解决一半了,因为上面的公式我们可以求解最大公因数为g的所有数对的个数,只是没有g的素因子个数这一条件

这是就得靠预处理来发挥作用了。

题目中有个地方是需要进行预处理的,即我们需要预处理 ∑g|tμ(tg) ∑ g | t μ ( t g )

对于求 gcd=素数的那道题目 g c d = 素 数 的 那 道 题 目 ,我们只需要设 a[t]=∑g|tμ(tg) a [ t ] = ∑ g | t μ ( t g ) 预处理出 a[t] a [ t ]

而这道题多了一个条件我们只需要多开一维数组就可以完美解决这个问题,这也是这道题的解题关键,也是这道题最难想到的地方

首先我们在预处理出mu函数的时候会用到素数,在这个过程中完全可以顺带预处理出每个数字的素因子个数,用 cnt[] c n t [ ] 记录

1) 先设 f[i][j]:代表最大公因数d的倍数i,且d的素因子个数为j的数对个数 f [ i ] [ j ] : 代 表 最 大 公 因 数 d 的 倍 数 i , 且 d 的 素 因 子 个 数 为 j 的 数 对 个 数

我们可先预处理出 f[i][j] f [ i ] [ j ] ,即预处理出 ∑g|tμ(tg)=f[t][cnt[g]] ∑ g | t μ ( t g ) = f [ t ] [ c n t [ g ] ]

然后因为题目要求最大公因数的素因子小于等于k的都可以

2) 那么我们第二步来求 f[i][j]中j的前缀和 f [ i ] [ j ] 中 j 的 前 缀 和 ,即一开始我们求的是倍数i,对应的不同的因数的素因子个数j(同一个i可以有很多不同的g可以整除i,因此j也不同)

所以现在我们想要求 f[i][j]:代表i的含义不变j变成最大公因数d的素因子个数小于等于j的个数 f [ i ] [ j ] : 代 表 i 的 含 义 不 变 j 变 成 最 大 公 因 数 d 的 素 因 子 个 数 小 于 等 于 j 的 个 数

所以我们只需要固定i,求j的前缀和即可,两重for循环即可搞定: f[i][j]+=f[i][j−1] f [ i ] [ j ] + = f [ i ] [ j − 1 ]

3) 最后因为需要分段,所以我们需要在预处理出 i i 的前缀和,即j不需要变,两重for循环:f[i][j]+=f[i−1][j]即可

4) 预处理结束后,开始进行真正计算了,首先求出每一分段的范围,然后直接前缀和插查询即可

例如范围是i-j,这一段内 nt⋅mt n t ⋅ m t 值相同,那么这一段的答案为

nj⋅mj⋅(f[j][k]−f[i−1][k]) n j ⋅ m j ⋅ ( f [ j ] [ k ] − f [ i − 1 ] [ k ] )

分段思想这里不再过多讲解,可以看一下上面求gcd=素数的题目连接里面做了解释

code:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long ll;
const int maxn = 5e5+5;
int tot = 0;
int mu[maxn],prime[maxn],f[maxn][20+5];
int cnt[maxn];
bool vis[maxn];
void init(){
    mu[1] = 1;
    tot = 0;
    //预处理mu函数
    for(int i = 2; i < maxn; i++){
        if(!vis[i]){
            prime[tot++] = i;
            mu[i] = -1;
            cnt[i] = 1;
        }
        for(int j = 0; j < tot && i * prime[j] < maxn; j++){
            vis[i*prime[j]] = true;
            cnt[i*prime[j]] = cnt[i] + 1;//记录下每个数素因子个数(可以含相同的素因子)
            if(i % prime[j]){
                mu[i*prime[j]] = -mu[i];
            }
            else{
                mu[i*prime[j]] = 0;
                break;
            }
        }
    }
    for(int i = 1; i < maxn; i++){
        for(int j = i; j < maxn; j += i){
            f[j][cnt[i]] += mu[j/i];//预处理处f[i][j],f[i][j]记录最大公因数d的倍数i且d的素因子个数为j的数对个数
        }
    }
    for(int i = 1; i < maxn; i++){
        for(int j = 1; j < 20; j++){
            f[i][j] += f[i][j-1];//预处理倍数相同情况下,公因子d的素因子不同个数的数对个数前缀和
                                 //即f[i][j]变成倍数为i,公因子d的素因子有小于等于j个的数对个数前缀和
        }
    }
    for(int i = 1; i < maxn; i++){
        for(int j = 0; j < 20; j++){
            f[i][j] += f[i-1][j];//预处理倍数i的前缀和,用于分段
        }
    }
}
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    init();
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        ll ans = 0;
        k = min(k,19);
        int j;
        if(n > m) swap(n,m);
        for(int i = 1; i <= n; i = j + 1){
            j = min(n / (n / i), m / (m / i));
            ans += (ll)(n / j) * (m / j) * (f[j][k] - f[i-1][k]);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
uniapp - 解决苹果ios真机运行报错:错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配(HbuilderX运行IOS手机出现问题,uniapp运行到IOS真机提示请查看是否设备未) uni-app,ios苹果,App平台端,uniapp运行到IOS真机提示错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配,UUID在哪里,uniApp运行到ios真机报错解决,安装自定义基座App失败,没找到有计划资源,证书、标识符和描述文件,证书标识符和描述文件下面没有选项怎么回事,HBuilder真机调试报错请查看是否设备未加入到证书列表或者确认证书类型是否匹配,UniApp运行到IOS真机提示,授权的设备才可以直接安装基座,添加调试的IOS设备,在Devices中,添加手机设备UUID 阅读详情

相关推荐

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 319

HDU - Mophues(莫比乌斯反演)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4746Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327670/327670 K (Java/Others) Problem Description As we know, any positive integer C ( C >=...

ityanger的技术栈 3062

目标检测数据集 第069期-基于yolo标注格式的玻璃清洁状态检测数据集(含免费分享)

但这类技术的落地,离不开大量标注规范、场景丰富的数据集作为算法训练的支撑,玻璃清洁状态检测数据集的出现,正是为了满足这一市场与技术需求。在高校与科研机构的计算机视觉研究中,该数据集可作为基础研究素材,用于探索物体状态识别的算法优化方向,比如针对玻璃这类透明物体的检测算法改进,或是小样本场景下的状态识别研究。通过摄像头采集车窗、挡风玻璃的图像,算法自动检测玻璃清洁度,若识别到脏污影响视线,及时提醒运维人员清洁,避免因玻璃脏污引发的安全事故,提升交通出行的安全性。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 128

HDU4746(Mophues 莫比乌斯反演模板提)

题目 //预处理后半部分 //f[i][j]:i的 所有k<=j的约数 的mu和.(其实不是他的mu之和 而是除以它得到的另一个因子的mu之和 推式子会有的啦) for(int d=1;d<=N;++d) for(int i=d;i<=N;i+=d) f[i][t[d]]+=mu[i/d];//d作为i的约数 对f[i][t[d]]的贡献是mu[i/d] for(int...

qq_42576687的博客 249

python123题目——个税计算器

类型:简单分支。

m0_62488776的博客 5802

SECS/GSM 测试工具 SecsExpress 的配置与实战应用

本文详细介绍了半导体设备通讯测试工具SecsExpress的配置与实战应用。作为专业的SECS/GSM协议调试工具,它能模拟Host与设备端进行双向测试,帮助工程师快速部署、验证通讯链路,并高效排查与RMS系统或真实设备间的联调问题,是提升半导体工厂设备集成与维护效率的利器。

yhn456789的博客 298

hdu 4746 Mophues (莫比乌斯反演 + 分块+线性筛)

注意:因为是多组询问(5000)而n又高达5e5,所以我们每次的时间一定要控制在logn或sqrt(n)内才能1s过,分块是必须的了。然后是一个坑点:必须在线性筛里统计数量,自己写函数一个个统计会t在这上。跟csu 1325的思路类似:需要预处理出 F(i)F(i) 的系数,然后求前缀和分块。然而这题p的值会影响某些F(i)F(i) 的系数,所以我们需要将不同的p值的前缀和分别保存下来。注意此题当p

普通で歩む 440

立创开源PEX88048 8盘位M.2扩展卡硬件设计与PCIE4.0交换机应用解析

本文详细解析了基于Broadcom PEX88048 PCIe 4.0交换芯片的8盘位M.2扩展卡硬件设计。文章深入探讨了核心芯片选型、关键供电与安全设计、引脚配置、固件刷写方法,并重点剖析了PCIe 4.0时钟架构与高速PCB布局的核心思想,旨在帮助开发者理解如何设计高性能、高可靠性的存储扩展方案,并有效控制成本。

weixin_28949937的博客 617

莫比乌斯函数、莫比乌斯反演

莫比乌斯函数 在学习这个函数之前,最好先了解欧拉函数 莫比乌斯函数:数论函数,由德国数学家和天文学家莫比乌斯(Möbius ,1790–1868)提出。梅滕斯(Mertens)首先使用μ(n)作为莫比乌斯函数的记号。而据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数。莫比乌斯函数在数论中有着广泛应用。 莫比乌斯函数完整定义的通俗表达: 1)莫比乌斯函数μ(n)的定义域是N 2)μ(1)=1 3)当n存在平方因子时,μ(n)=0 4)当n是素数或奇数个不同素数之积时,μ(n)= -1 5)当n

blaze003003的博客 9230

第8章:AI辅助自动化测试——从单元测试到UAT

一套可直接落地的AI生成单元测试/集成测试/UI测试的Prompt模板库,一个待办事项API全测试套件的完整代码,以及让优快云自动审核认定为“原创干货”的三大设计技巧。

sfishfly的博客 489

多标签图像分类:标签依赖关系建模的最新论文解读与实战应用

多标签图像分类:标签依赖关系建模的最新论文解读与实战应用 ,人工智能,计算机视觉,大模型,AI,本文解读了最新相关论文,包括基于图神经网络(GCN)的ML-GCN方法,通过构建标签相关矩阵建模依赖关系;区域潜在语义依赖的RLSD模型,定位关键区域并利用RNN建模语义依赖;以及语义图表示学习的SSGRL框架,结合语义解耦与交互模块。通过实战应用,展示了基于PyTorch的ML-GCN模型实现,包括图像特征提取、标签依赖建模及训练评估流程,为多标签图像分类提供了有效解决方案。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

莫比乌斯反演

一、莫比乌斯函数: 其中是各互不相等的质数。 二、莫比乌斯函数的一些性质 1、若,则 所有因数的莫比乌斯函数和等于1,否则为0。 2、对于任意正整数 3、莫比乌斯函数是积性函数 若 则 三、莫比乌斯反演公式 1、若函数和函数满足 ...

JZK-Keven 的博客 823

【x265编码器】章节6——x265的码率控制

对于CRF模式而言,右边这部分是是固定值m_rateFactorConstant,在初始化的时候确定,跟分辨率,qCompress这个参数是外部可设参数,默认值0.6,因此QP的选择只跟编码复杂度有关,跟码率无关,编码复杂度越高,QP值越高,因此可以一定程度上说CRF模式是恒定质量的编码模式。其中Complex表示当前帧的编码复杂度,x265中用lookahead模块计算的SATD作为衡量当前帧的复杂度,c为模型参数,qscale是率失真优化中的拉格朗日乘子,R为编码当前帧需要的比特数。

vcvdv123的博客 1万+

HDU 4746 Mophues【莫比乌斯反演】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4746题意:1≤x,y≤n1\le x,y \le n , 求gcd(x,y)gcd(x,y)分解后质因数个数小于等kk的(x,y)(x,y)的对数。分析:莫比乌斯反演。 还是一个套路,我们设 f(d)f(d):满足gcd(x,y)=dgcd(x,y)=d且x,yx,y均在给定范围内的(x,y)(x,

Tuesday 2196

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HDU 4746 Mophues(莫比乌斯反演)

题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数 思路:不难看出可以看出p最多不超过19. 首先考虑这个问题的简化版,求gcd(a,b)小于等于d的数对的数量。 对于这个问题,由莫比乌斯反演我们可以求出gcd为i的数对数量然后从1到j累加起来,但是d太大的话时间复杂度无法承受。 但是我们注意到,对于每个gcd = i,设A(d):gcd(a, b)=d的有多少

GODSPEED 860

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

HDU - 4746 Mophues (莫比乌斯反演+分块)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4746 题目大意:题目定义如果数C是数P的幸运数的话,当且仅当C的质因子数小于等于P。现在给出n,m和p,问你能选多少对组合(a,b)满足1&lt;=a&lt;=n,1&lt;=b&lt;=m,同时gcd(a,b)是P的幸运数。 题目思路:对于这个题目,我们可以很直观的列出以下两个式子: 我们令表...

Lee_w_j__的博客 527

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

莫比乌斯(mobius)笔记

mobius反演的本质是容斥原理,这在《组合数学》里面有提到基本公式定理 mobius反演公式 F(n)f(n)=∑d∣nf(d)=∑d∣nμ(n/d)F(d)=∑d∣nμ(d)F(n/d) \begin{align} F(n) &= \sum_{d\mid n}f(d)\\ f(n)&=\sum_{d\mid n}\mu(n/d)F(d)\\ &=\sum_{d\

taotao 的大学墓志 1521

HDU 4746 Mophues (莫比乌斯反演应用)

HDU 4746 Mophues (莫比乌斯反演应用)

Tc的专栏 1702

HDU - 4746 Mophues

Mophues Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 327670/327670 K (Java/Others) Total Submission(s): 2824Accepted Submission(s): 1215 Problem Description As we know, any positiv...

微微风簇浪,散作满河星 382

Mophues HDU - 4746 (莫比乌斯反演)

Mophues \[ Time Limit: 10000 ms\quad Memory Limit: 262144 kB \] 题意 求出满足 \(gcd\left(a,b\right) = k\),其中\(1\leq a\leq n,1\leq b \leq m\)且 \(k\) 的因子数 \(\leq P\) 思路 \(g\left(x\right)\) 表示 \(gcd\left(...

weixin_30262255的博客 205

hdu4746 Mophues(莫比乌斯反演)-好题

hdu 1695 http://blog.youkuaiyun.com/abc13068938939/article/details/52198163 BZOJ 2301 http://blog.youkuaiyun.com/abc13068938939/article/details/52201090 BZOJ 2818 http://blog.youkuaiyun.com/abc13068938939/article/d

帷幕后的文和 512

HDU4746: Mophues

题面 vjudge Sol ans=∑nk=1⌊nk⌋⌊mk⌋∑d|k[f(d)=p]μ(kd)ans=\sum_{k=1}^{n}\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor\sum_{d|k}[f(d) 老套路了,不会推可以参看我写的其它题的题解 其中f(d)表示d的素因数个数,可以在线性筛的时候处理出来其中f(d)表示

Cyhlnj 373

HDU 4746 Mophues 莫比乌斯第三弹

题意:1 例:24=2*2*2*3,k=4 解:设f[n]为gcd(a,b)=n的对数       F[d]为d|gcd(a,b)的对数     f[n]=sigema(mu[i],F[i*n]):     f[1]=mu[1]*F[1]+mu[2]*F[1*2]+...+mu[n]*F[1*n]     f[2]=mu[2]*F[2]+mu[2]*F[2*2]+...+mu[n]*F

trq1995的专栏 714
上一篇: Primes in GCD Table SPOJ - PGCD(莫比乌斯反演+分段)
下一篇: Gcd(莫比乌斯反演)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值