HDU 3071 Gcd & Lcm game

这是一篇关于如何使用位压缩技术处理线段树以解决HDU 3071题目的博客。文章指出,由于题目中涉及的前100个自然数的LCM过大,不能直接使用常规线段树。作者通过分析质因数,发现可以使用32位整数来表示质因子的数量,从而实现位压缩。博客详细介绍了位压缩的实现思路,并强调了在编写代码时需要注意的两点细节。
摘要由CSDN通过智能技术生成

    纠结了很久的题目。看上去是一道裸的线段树,但是需要对数据做特殊的处理。

    题意:n(1<=n<=10^5)个数字,q(1<=q<=10^5)个操作。每个操作可能有3种情况:1.询问[k1,k2]区间数字的GCD%p; 2.询问[k1,k2]区间数字的LCM%p; 3.将k位置的数字改为v。对于前两个操作输出对应的值。题目保证这n个数不管在什么时候都不超过100

    对点修改,对区间查询,最基础的线段树。但是,前100个自然书的LCM非常大,超long long,不能直接套线段树。要用到位压缩。前100个数字里包含25个质数分别是:2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97。在一个数字里,质因子2最多出现6次(用3位2进制数表示),3最多出现4次(用3位2进制数表示),5最多出现2次(用2位2进制数表示),7最多出现2次,其余的最多出现1次(用1位2进制数表示)。全加起来3+3+2+2+21=31位,也就是说可以用一个32位整数表示质因子的数量。剩下的就是裸线段树了。

    有2点需要注意的,写在代码注释里了。

#include<stdio.h>
#include<iostream>
using namespace std;

#define Maxn 100010

struct node
{
    int l,r,gcd,lcm;
}tree[Maxn*4];

int n,q,A[Ma
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值