CF1114F Please, another Queries on Array?【线段树+欧拉函数】

在 CentOS7 下安装 Cadence IC验证平台 INCISIVE152 前言 本文所使用的软件 虚拟机软件:VMware Workstation 15 PRO 如何安装? 操作系统:CentOS-7, CentOS-7-x86_64-DVD-1810.iso 如何安装? 简介 INCISIVE Incisive是nc_verilog, nc_sim, nc_lauch,以及ABV,TBV的集合,用于仿真和验证。 InstallScape InstallSc... 阅读详情

题意

你有一个数组a1,a2,…,ana_1,a_2,\dots,a_na1​,a2​,…,an​。

现在你需要完成qqq次操作,有以下两种操作形式:

  1. MULTIPLY l r x,对于所有i(l≤i≤r)i(l\le i\le r)i(l≤i≤r),将aia_iai​乘上xxx。

  2. TOTIENT l r,求出φ(∏i=lrai)\varphi(\prod_{i=l}^ra_i)φ(∏i=lr​ai​),对109+710^9+7109+7取模后的结果。其中φ\varphiφ表示欧拉函数,φ(n)\varphi(n)φ(n)的定义为1…n1\dots n1…n中与nnn互质的数的个数。

时间限制

5.50s

内存限制

250.00MB

思路

对于某个数的欧拉函数,可以通过质因数分解求解,若a=∑ipiαia = \sum_ip_i^{\alpha_i}a=∑i​piαi​​,那么φ(a)=a∏ipi−1pi\varphi(a) = a\prod_i\frac{p_i - 1}{p_i}φ(a)=a∏i​pi​pi​−1​。
同时,观察到每个数的大小只有300,通过猜想与打表验证之后发现300以内的质数只有62个,那么可以把是否包含这些素数用long longlong\ longlong long状压起来。用线段树维护每一个区间所有数的乘积极其包含的质因数即可。
维护每个区间数的乘积就是维护乘法而已,非常简单。
维护每个区间数的乘积包含的质因数,由于状压起来了,那么两个子区间的状态进行或运算就可以。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <cmath>

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 400005, mod = 1000000007;

int n, m;
int a[N];
int p[305];
bool vis[305];

struct Tree
{
    int l, r;
    LL pstate; int mul;
    LL plz; int mullz;
}t[N << 2];

void get_prime(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!vis[i]) p[++ p[0]] = i;
        for (int j = 1; j <= p[0] && i * p[j] <= n; j ++ )
        {
            vis[i * p[j]] = true;
            if (i % p[j] == 0) break;
        }
    }
}

int qpow(int a, int b)
{
    int res = 1;
    while (b)
    {
        if (b & 1) res = 1LL * res * a % mod;
        b >>= 1;
        a = 1LL * a * a % mod;
    }
    return res;
}

void push_up(int i)
{
    t[i].mul = 1LL * t[i << 1].mul * t[i << 1 | 1].mul % mod;
    t[i].pstate = t[i << 1].pstate | t[i << 1 | 1].pstate;
}

void calc(int i, int mul, LL state)
{
    t[i].mul = 1LL * t[i].mul * qpow(mul, t[i].r - t[i].l + 1) % mod;
    t[i].pstate |= state;
    t[i].mullz = 1LL * t[i].mullz * mul % mod;
    t[i].plz |= state;
}

void push_down(int i)
{
    if (!t[i].plz) return;
    int mul = t[i].mullz;
    LL state = t[i].plz;
    calc(i << 1, mul, state);
    calc(i << 1 | 1, mul, state);
    t[i].plz = 0, t[i].mullz = 1;    
}

void build(int i, int l, int r)
{
    t[i].l = l, t[i].r = r;
    t[i].mul = 1, t[i].mullz = 1;
    if (l == r)
    {
        int x = a[l];
        t[i].mul = x;
        for (int j = 1; j <= p[0]; j ++ )
            if (x % p[j] == 0)
                t[i].pstate |= 1LL << (j - 1);
        return;
    }
    int mid = (l + r) >> 1;
    build(i << 1, l, mid);
    build(i << 1 | 1, mid + 1, r);
    push_up(i);
}

void update(int i, int l, int r, int x, LL xp)
{
    if (l <= t[i].l && t[i].r <= r)
    {
        calc(i, x, xp);
        return;
    }
    push_down(i);
    int mid = (t[i].l + t[i].r) >> 1;
    if (l <= mid) update(i << 1, l, r, x, xp);
    if (r > mid) update(i << 1 | 1, l, r, x, xp);
    push_up(i);
}

pair<LL, int> query(int i, int l, int r)
{
    if (l <= t[i].l && t[i].r <= r)
    {
        pair<LL, int> tt = make_pair(t[i].pstate, t[i].mul);
        return tt;
    }
    push_down(i);
    int mid = (t[i].l + t[i].r) >> 1;
    if (l > mid) return query(i << 1 | 1, l, r);
    else if (r <= mid) return query(i << 1, l, r);
    else 
    {
        pair<LL, int> ls = query(i << 1, l, r);
        pair<LL, int> rs = query(i << 1 | 1, l, r);
        ls.first |= rs.first;
        ls.second = 1LL * ls.second * rs.second % mod;
        return ls;
    }
}

int main()
{
    #ifdef ZYCMH
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
    #endif
    get_prime(300);
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ )
        scanf("%d", &a[i]);

    build(1, 1, n);
    
    for (int i = 1; i <= m; i ++ )
    {
        char s[10];
        scanf("%s", s);
        if (s[0] == 'T') 
        {
            int l, r;
            scanf("%d%d", &l, &r);
            pair<LL, int> t = query(1, l, r);
            int ans = t.second;
            LL pstate = t.first;
            for (int j = 1; j <= p[0]; j ++ )
                if (pstate & (1LL << (j - 1)))
                    ans = 1LL * ans * (p[j] - 1) % mod * qpow(p[j], mod - 2) % mod;
            printf("%d\n", ans);
        }
        else 
        {
            int l, r, x;
            scanf("%d%d%d", &l, &r, &x);
            LL xp = 0;
            for (int j = 1; j <= p[0]; j ++ )
                if (x % p[j] == 0) 
                    xp += (1LL << (j - 1));
            update(1, l, r, x, xp);
        }
    }
    return 0;
}

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】Caliper从0到使用 技能大赛样题解析,caliper题目从0到使用 阅读详情

相关推荐

抖音直播行为规范考试

抖音直播行为规范考试

Q1642968641的博客 1万+

CF 1114F Please, another Queries on Array?(欧拉函数&线段树)

F. Please, another Queries on Array?(欧拉函数&amp;线段树) 1114F - Please, another Queries on Array? 题目大意 给出一段序列.现可对其进行两种操作.其一是将一段区间l到r之间的所有数乘上某个值x,其二是求一段区间l到r的ϕ(∏lrai)\phi(\prod^r_la_i)ϕ(∏lr​ai​)其中ϕ\phiϕ为求欧拉...

FLY_WHITE的博客 511

OCTF2016--piapiapia

知识点: php反序列化长度变化尾部字符串逃逸 目录扫描发现www.zip,下载得到源码 源码有index.php,输入账号密码后会进入profile.php,还有register.php、updata.php、class.php和config.php flag值在config.php中,想办法访问到其内容 通过seay代码审计找到一点线索 看到profile.php中存在任意文件读取漏洞,前面还有反序列化 现在我们有个大体思路了,update.php中有一个$prof..

Oavinci的博客 474

F. Please, another Queries on Array? (线段树维护区间积的欧拉函数)

传送门 给定序列,两种操作,区间每个数乘v,求区间积(对1e9+7取模)后的欧拉函数。 序列每个数以及v都不超过300。 首先bd得到欧拉函数的计算公式: 首先序列每个数不超过300,v也不超过300,300以内的质数很少,打表发现只有62个,这个信息显然很有用。 区间欧拉函数就是区间积,很明显可以用线段树维护 。 质因子项我们可以预处理+逆元得到,用f[i]表示第i个质数p[i]的 (p[i]-1)/p[i] % mod 关键是x在乘完之后要取模,取模后求的质因子肯定是错了的,所以我们维护区间积的同

矮纸斜行闲作草 348

零基础做完YOLOv8船只检测系统:HRSC2016数据集 + 完整UI,稳过答辩

亲爱的同学,通过这篇教程,你已经掌握了“基于YOLOv8的HRSC2016微小船只检测系统”从数据集处理、模型训练到Tkinter界面开发的全流程。这个课题既贴合“海事智能化”的产业战略,又涵盖了“目标检测、深度学习、界面开发”等多个毕设评分点,非常适合作为计算机或海事工程专业的毕业设计。在实践中,你可能会遇到“海面背景复杂导致船只漏检”“微小船只识别精度不足”“UI与模型推理同步卡顿”等挑战——别担心,这些都是技术成长的必经之路。

FJN110的博客 108

虚拟电厂功率预测最佳实践白皮书

虚拟电厂(VPP)通过聚合分散的可再生能源资源,为电网提供可观测、可调度和可交易的解决方案。本文提出了一套功率预测方法论,并给出LSTM实现脚本,涵盖资源接入、数据治理、预测模型设计及市场交易闭环。针对风-光-储-负荷混合场景,该方法论强调轻量化部署和滚动优化,可有效提升预测精度和调度收益。未来研究将融合深度气象预报和强化学习,进一步优化VPP的协同调度能力。

专注AI大模型,软件混淆,授权 377

CF1114F. Please, another Queries on Array?

没有注意到所有的因子都是300以内,注意到了也想不到这样就可以用集合来表示质数是否出现,从而直接计算出欧拉函数。 打标记的线段树在change的时候忘记pushdown了,调了一天orz #include &amp;amp;lt;iostream&amp;amp;gt; #include &amp;amp;lt;cstdio&amp;amp;gt; #include &amp;amp;lt;string&amp;amp;gt; #include &am

zz_ylolita 411

SAP-ABAP:SAP数据库视图(Database View)详解-创建

数据库视图是SAP中实现多表关联查询的基础工具,适合简单的跨表查询和权限控制场景。但其功能有限,对于复杂逻辑或高性能需求,建议结合CDS视图或ABAP程序开发。通过合理设计,数据库视图可显著提升开发效率和系统可维护性。它存储在数据库中,但本身不存储数据,仅通过查询动态生成结果。是一种基于物理数据库表的虚拟表,通过关联多个表(使用。

baidu_35680696的博客 1370

CF1114F-Please, another Queries on Array?【线段树,欧拉函数】

正题 题目链接:https://www.luogu.com.cn/problem/CF1114F 题目大意 nnn个数的一个序列要求支持 区间乘上一个数 询问一个区间的乘积的φ\varphiφ值 解题思路 因为数很小,而我们求φ\varphiφ需要知道一个数所包含的质因子。发现在300300300以内的只有626262个质数,那么我们可以状态压缩起来一个数SSS表示状压后的所拥有的质数集合。 用线段树维护区间乘机和质数集合即可,时间复杂度O(nk+qlog⁡n)O(nk+q\log n)O(nk+q

QuantAsk 410

“华为杯”研究生数学建模竞赛2020年-【华为杯】E题:能见度估计与预测(附获奖论文及python代码实现)

因此,题目要求借助机场的 AMOS 观测数据中的气压、温度、湿度、风速等气象因子,达到 100% 时,空气中的水汽便会凝结成细微的水滴悬浮于空中,使地面水平的能见度下。传统的仪器探测法成本高,覆盖范围小,而基于视频的能见度检测能弥补仪器测量的不足之处,但是预测精度不高,需要进一步改。象条件,空气质量的影响,其中较为关键的影响因子是雾和霾。性过强,激光能见度仪的检测方法更为可信,但是激光能见度仪覆盖的检测范围小,安装。覆盖的交通视频路况数据间接计算得到能见度数值的方法,此方法成本较低,覆盖范围广。

getusushu的博客 2285

手把手教你RK3568 MIPI屏驱动适配,纯干货!

RK3568 作为一款高性能的多媒体处理器,在嵌入式领域中备受瞩目。它采用了先进的 22nm 制程工艺,搭载四核 Cortex-A55 处理器,这种架构为芯片提供了高效的功耗比,使其在运行各种复杂任务时,既能保证性能,又能有效控制功耗。在实际应用中,无论是多任务处理还是运行大型应用程序,RK3568 都能凭借其四核 Cortex-A55 处理器,实现流畅的操作体验,满足智能设备对高性能和低功耗的需求。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4071

CF1114F Please, another Queries on Array?(线段树,数论,欧拉函数,状态压缩)

这题我在考场上也是想出了正解的……但是没调出来。 题目链接:CF原网 题目大意:给一个长度为 $n$ 的序列 $a$,$q$ 个操作:区间乘 $x$,求区间乘积的欧拉函数模 $10^9+7$ 的值。 $1\le n\le 4\times 10^5,1\le q\le 2\times 10^5,1\le a_i,x\le 300$。时限 5.5s,空限 256MB。 明显线段树...

angzuo8655的博客 142

基于多智能体强化学习的轨道追逃博弈方法复现

本文提出了一种基于多智能体深度强化学习(MADDPG)的空间轨道追逃博弈方法。通过构建Actor-Critic网络架构,采用集中训练分布式执行的策略,使卫星群能够自主协调完成对非合作目标的围捕任务。代码实现了经验回放缓冲区、噪声探索机制和网络参数更新等核心功能,通过奖励函数设计平衡最短时间、燃料消耗和碰撞规避等目标。仿真结果表明该方法能有效利用数量优势,涌现出智能协同行为,为解决复杂空间博弈问题提供了新思路。

huanghm88的专栏 337

CF1114F Please, another Queries on Array?

CF1114F Please, another Queries on Array? 考虑用线段树维护取模后的区间积和真正的区间积所含有的质因子. 每次询问查得这两个值后,一乘一除,即可算出该区间积的欧拉函数. 区间积容易维护,主要考虑如何维护所含的质因子. 注意到 \(a_i\) 和每次乘的 \(x\) 都 \(\leq 300\) , 而 \(300\) 以内的质数恰有 \(62\) 个,所以...

weixin_30791095的博客 135

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Codeforces 1114F Please, another Queries on Array? [线段树,欧拉函数]

Codeforces 洛谷:咕咕咕 CF少有的大数据结构题。 思路 考虑一些欧拉函数的性质: \[ \varphi(p)=p-1\\ \varphi(p^k)=p^{k-1}\times (p-1)=p^k \times \frac{p-1}{p},k>0\\ \varphi(ab)=\varphi(a)\varphi(b),gcd(a,b)=1\\ \dots \] 有上面三...

dfn8726的博客 145

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Codeforces Round #538 (Div. 2) (CF1114)

Codeforces Round #538 (Div. 2) (CF1114)   今天昨天晚上的cf打的非常惨(仅代表淮中最低水平   先是一路缓慢地才A掉B,C,然后就开始杠D。于是写出了一个O(n^2)的线性dp,然后就wa6,调到结束。结束后发现完全看漏了两句话。噢,起始点!!!   好吧然后算算自己有可能这一场要变成+0,反正在0左右。 结束后开始然后开始写D,顺便思考F。结果写完D发现...

weixin_30532369的博客 149

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 255

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 350

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 394

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 89

【C++ 基础入门】C++11新特性(下):可变参数模板、lambda 表达式与包装器

C++11高阶特性(可变参数模板与参数包展开、emplace_back、lambda表达式与捕获列表、仿函数、std::function包装器)

2601_96587588的博客 228

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 254

1-10 PostgreSQL中多表连接全解:inner/left/right/full/cross join

本文基于 PostgreSQL 15+ 完整拆解 5 种主流连接:内连接、左连接、右连接、全连接、笛卡尔连接。结合可落地的测试数据,演示每种连接的执行逻辑、返回结果,重点剖析 NULL 值对 JOIN 匹配的核心影响,彻底解决多表连接数据丢失、匹配异常、结果错乱的问题。

zhangjw34的专栏 110

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 173

【C++ 基础入门】C++继承(下):问题、底层原理与组合

C++继承(菱形继承的问题、虚继承原理、继承与组合、构造顺序)

2601_96587588的博客 802

c++ explicit关键字详解

explicit。

拒绝AI文,努力在AI时代写出感动人心的好文章 165
上一篇: 【树形dp】 [POI2014] FAR-FarmCraft
下一篇: CF515E Drazil and Park【思维+线段树】
juruo_c
博客等级 码龄6年 520粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值