2021 ICPC 网络赛 第二场 L Euler Function(势能线段树,欧拉函数,状态压缩)

news/发布时间2024/8/25 5:49:18
2021 ICPC 网络赛 第二场 L Euler Function

题意

给定序列,定义两个操作

  • \(l,r,x\)对区间\([l,r]\)的数乘\(x\)
  • \(l,r\)\(\sum \phi {a}_{i}\)

思路

注意欧拉函数的性质,若\(i\bmod p= 0\)\(\phi (i * p)=p*\phi (i)\),否则\(\phi(i * p) = (p - 1) * \phi (i)\)

因为\(x,w\)的值都小于\(100\),因此我们可以对线段树维护区间所有质因子的交集,当区间内交集有\(prime\),那么直接对区间乘\(prime\),否则递归到叶子节点,乘\(prime - 1\)(次数不会很多)

实现可以考虑直接用std::bitset维护每个区间的质因子状态,我这里用的是离散化之后再状压。

#include <bits/stdc++.h>
using namespace std;#define int long long
const int N = 1e5 + 10;
int a[N];
std::vector<int> minp, primes;
vector<int> fac[110];
int id[110], phi[110];
const int mod = 998244353;
struct node {int sum;int mul;int st;
}tr[N << 2];
void sieve(int n) {minp.assign(n + 1, 0);primes.clear();phi[1] = 1;for (int i = 2; i <= n; i++) {if (minp[i] == 0) {minp[i] = i;id[i] = primes.size();primes.push_back(i);phi[i] = i - 1;}for (auto p : primes) {if (i * p > n) {break;}minp[i * p] = p;if (p == minp[i]) {phi[i * p] = phi[i] * p;break;} else {phi[i * p] = phi[i] * (p - 1);            }}}
}
void pushup(node &u, node &l, node &r) {u.sum = (l.sum + r.sum) % mod;u.st = l.st & r.st;
}
void pushup(int k) {pushup(tr[k], tr[k + k], tr[k + k + 1]);
}
void pushdown(int k) {if (tr[k].mul > 1) {auto &u = tr[k], &l = tr[k + k], &r = tr[k + k + 1];int x = u.mul;l.sum = l.sum * x % mod;r.sum = r.sum * x % mod;l.mul = l.mul * x % mod;r.mul = r.mul * x % mod;u.mul = 1;}
}
void build(int k, int l, int r) {tr[k].mul = 1;if (l == r) {tr[k].sum = phi[a[l]];for (auto &x : fac[a[l]]) tr[k].st |= (1ll << id[x]);return ;}int mid = l + r >> 1;build(k + k, l, mid);build(k + k + 1, mid + 1, r);pushup(k);
}
void rangemodify(int k, int l, int r, int ql, int qr, int w) {if (l == r) {if ((tr[k].st & (1ll << id[w]))) {tr[k].sum *= w;tr[k].sum %= mod;} else {tr[k].sum *= w - 1;tr[k].sum %= mod;}tr[k].st |= (1 << id[w]);return ;}if (l >= ql && r <= qr) {//关键,只有该区间完全包含这个质因子才retrun,否则继续递归下去if ((tr[k].st & (1ll << id[w]))) {tr[k].mul = tr[k].mul * w % mod;tr[k].sum = tr[k].sum * w % mod;return ;}}pushdown(k);int mid = l + r >> 1;if (ql <= mid) rangemodify(k + k, l, mid, ql, qr, w);if (qr > mid) rangemodify(k + k + 1, mid + 1, r, ql, qr, w);pushup(k);
}
int rangesum(int k, int l, int r, int ql, int qr) {if (l >= ql && r <= qr) return tr[k].sum;pushdown(k);int mid = l + r >> 1;int res = 0;if (ql <= mid) res += rangesum(k + k, l, mid, ql, qr), res %= mod;if (qr > mid) res += rangesum(k + k + 1, mid + 1, r, ql, qr), res %= mod;return res;
}
void solve() {sieve(110);for (int i = 1; i <= 100; i ++) {int x = i;for (auto p : primes) {if (i < p) continue;while (x % p == 0) {x /= p;fac[i].emplace_back(p);}}if (x > 1) fac[i].emplace_back(x);}int n, m;cin >> n >> m;for (int i = 1; i <= n; i ++) {cin >> a[i];}build(1, 1, n);while (m --) {int op;cin >> op;if (op) {int l, r;cin >> l >> r;cout << rangesum(1, 1, n, l, r) << "\n";} else {int l, r, w;cin >> l >> r >> w;for (auto x : fac[w]) {rangemodify(1, 1, n, l, r, x);}}   }
}
signed main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;t = 1;// std::cin >> t;while (t--) {solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.liansuoyi.cn/news/70114132.html

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

需求流程

产品愿景目标用户:学校内专业、学院的羽毛球运动员、教练以及教师,用于管理羽毛球比赛积分和晋级信息。 他们的需要或机会:提供一个方便的平台来记录和管理学校内羽毛球比赛数据,包括积分、排名以及教师的比赛晋级信息,以激励学生参与体育活动,促进羽毛球比赛的发展和提升…

idea 创建springboot项目

参考—— https://blog.csdn.net/Alger_/article/details/128749131——————————需要联网创建————创建项目 new project——》Spring initializr next springboot的版本与jdk版本有关 2.x :jdk8 3.x :jdk17 只选择web 下的spring web ——》create 项目需要联网下…

Xdown 多功能多线程并发下载工具

下载地址:https://www.mediafire.com/file/942px42bad7exdf/Xdown%25E4%25B8%258B%25E8%25BD%25BD%25E5%25B7%25A5%25E5%2585%25B7.zip/file Xdown是一款超级强大且免费无广告的Torrent(BT)/磁力链/Aria2/HTTP下载工具。Xdown不光如此还支持BT做种,使用 Xdown下载器让我们跟…

直播预约丨《指标体系建设实战》第四期:如何构建全面的指标管理体系

指标是反映企业的各项核心业务活动、管理成效的数据体系,指标体系作为联结业务逻辑与数据实体的关键桥梁,是构建高质量数据统计的基础单元,并在量化业务绩效和效果评估中扮演着核心角色。 为了更好地服务于客户并提供切实可行的实践指导,自4月24日起,袋鼠云将推出全新《指…

idea 查看项目的git路径

目录 第一种方式: 第二种方式: 第三种方式:第一种方式: 1、打开项目,在工程上右键,选择Show in Explorer; 如下图:2、此时会打开本地的代码路径窗口; 如下图:3、双击工程,会出现git目录文件夹;4、双击进去git目录, 打开config文件夹;5、文件里面的url 属性即为gi…

从校招新星到前端技术专家的成长之路

引言 我在2018年校招进入京东,主要负责广告投放系统的前端工作。在京东,这一路走来,我经历了多种角色转换,我从学生到职场人,从校招生到校招导师,从初级前端开发到前端技术专家,也见证了京东广告业务的蓬勃发展。 回顾过去的成长历程,我心中充满了感慨。首先,我要衷心…

Docker启动时报错:当前电脑配置不支持WSL2,请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化

首先我不知道我为什么会报这种错,因为我看了一下我的虚拟机平台和hyper-v都是启动的了。所以只能重新勾选hyper-v,然后再在powershell中重新启动虚拟化服务了。如果没有权限就管理员身份运行。bcdedit /set hypervisorlaunchtype auto都弄完后重启电脑即可。成功页面(不闪退…

nginx对访问路径进行限制【部分接口可以内外网访问、剩余接口只可以内网访问】

前言 最近这段时间的项目被查出了安全漏洞、然后做了一些安全措施的整改。整改后、BOSS又提了个很有意思的思路。 涉及到小程序端的请求接口、内外网都可以访问。 涉及到后台管理的请求接口、只允许内网访问。开干开干 由于项目引进了gateway网关、一开始的时候。我…

【C++】map

1、定义 template<class Key,class T,class Compare = std::less<Key>,class Allocator = std::allocator<std::pair<const Key, T>> > class map;namespace pmr {template<class Key,class T,class Compare = std::less<Key>> using map …

【C++】创建对象写法

1、在栈中创建对象 栈中创建的对象,不用我们手动释放资源。 和创建基本类型一样,直接声明即可,如果有参数,则用括号。 vector<int> a; // 默认构造函数 vector<int> b(实参); // 其他构造函数2、在堆中创建对象 堆中创建的对象,需要我们手动释放资源。 使用ne…

【C++】使用ort推理yolov10

【C++】使用ort推理yolov10 前言:由于笔者是编导专业,想玩玩yolo模型,搜来搜去全是python,所以在学会之后写一篇文章帮助和笔者同样情况的人 环境 Windows 10 C++17 onnxruntime18.1(DML版本) opencv4.9 visual studio2022 1. 环境配置 1.1 OpenCV环境配置 1.1.1 OpenCV …

八大作业管理流程

安全影响力的小编非常喜欢王老师的风格,抄了他的创意,把八大高危作业做了一个“一图看懂”系列。

onnxruntime无法使用GPU加速 加速失败 解决方法【非常详细】

CreateExecutionProviderInstance CUDA_PATH is set but CUDA wasnt able to be loaded. Please install the correct version of CUDA andcuDNN as mentioned in the GPU requirements page onnxruntime GPU加速onnx 无法使用GPU加速 加速失败 解决方法【非常详细】应该是自目…

2024/7/15 模拟赛 记录

noip NOI plus!几乎全员爆蛋( 本来能拿T1 20pts 暴力分的,但是居然CE了!!! max里两个参数,一个int一个longlong dev居然没报!!!光荣爆蛋(我估计是全场唯一一个没过编的:( 题解已存至网盘 https://fzoishare.xndxfz.com:7123/

状压DP

状压DP 状压 DP 是动态规划的一种,通过将状态压缩为整数来达到优化转移的目的。 例题 https://www.luogu.com.cn/problem/P1896 思路 一行中所有放置的状态可以用二进制数表示:如01000111(1代表当前位置放置物品) 因此,我们可以先找出所有的合法状态,(利用dfs进行递归) 并…

Apache服务器上的No input file specified错误

错误提示: Apache服务器上的No input file specified错误 解决方案: 在根目录下找到php5.ini文件(如果找不到就建立一个),在里面加上如下内容 cgi.fix_pathinfo = 1本文来自博客园,作者:黄文Rex,转载请注明原文链接:https://www.cnblogs.com/hwrex/p/18303797

软件测试理论知识-分类和方法

一、软件测试分类汇总分类方法分类内容按开发阶段 单元测试、集成测试、系统测试、验收测试按测试实施组织 α、β、第三方按测试执行方式 静态测试、动态测试按是否查看代码 黑盒测试、白盒测试、灰盒测试按是否手工执行划分 手工测试、自动化测试按测试对象划分 性能测试、安…

NPA论文阅读笔记

NPA: Neural News Recommendation with Personalized Attention论文阅读笔记 这个又是一篇很老但是很经典的论文,这里来读一下 Abstract 现存的问题: ​ 不同的用户通常有不同的兴趣爱好,同一用户也可能有不同的兴趣爱好。因此,不同的用户点击同一篇新闻时可能会关注不同的…

神经网络中神经元的权重更新

前段时间写过一篇介绍神经网络的入门文章:神经网络极简入门。那篇文章介绍了神经网络中的基本概念和原理,并附加了一个示例演示如何实现一个简单的神经网络。 不过,在那篇文章中并没有详细介绍神经网络在训练时,是如何一步步找到每个神经元的最优权重的。本篇介绍神经网络训…

笛卡尔树

笛卡尔树基本概念 笛卡尔树是基于一个静态序列 \(a\) 的,根据这个序列 \(a\),我们可以构造出对应的笛卡尔树。 笛卡尔树有三点要求需要满足:笛卡尔树是二叉树。笛卡尔树的编号的中序遍历为 \(1\sim n\),权值中序遍历为 \(a\)。笛卡尔树的权值满足大根堆或者小根堆的性质。这…
推荐文章