dalaoYHH爆虐

问题 H:mcd

题目描述

给出两个长为 \(n\) 的数列 \({a_n},{b_n}\),保证 \(a_i\le b_i(i=1,2,\cdots,n)\)。

现在您需要对于所有的 $k \in [1,m] \cup \mathbb{Z} $,求出满足以下条件的数列 \(c\) 的数量:

  • 长为 \(n\);
  • \(a_i\le c_i\le b_i (i=1,2,\cdots,n)\);
  • \(\gcd\limits_{i=1}^n{c_i}=k\),其中 \(\gcd\) 是最大公约数的英文简写。

对 \(998244353\) 取模。

输入格式

第一行两个正整数 \(n,m\)。

此后 \(n\) 行,每行两个正整数,分别表示 \(a,b\)。

输出格式

一行一个非负整数,表示数列数对 \(998244353\) 取模的结果。

样例输入

3 10
1 9
4 8
7 10

样例输出

151
20
3
3
1
0
1
1
0
0

提示

对于 \(100\%\) 的数据,\(1\le n,m,a_i,b_i\le 10^5,a_i\le b_i\)。

题解

首先可以想到容斥,定义函数\(f(i,j)=\lfloor\frac{b_i}{j}\rfloor-\lfloor\frac{a_i-1}{j}\rfloor\)

设\(G_i\)代表最大公约数为\(k\)的倍数的数列的个数,对于每个\(G_i\),\(G_i=\prod\limits_{j=1}^n{f(j,i)}\)

但是这样肯定会超时,左思右想想不出来,后来YHH&XWKdalao告诉了我做法,核心优化叫做整除分块

这个东西是什么呢,就是对于一个算式 \(H(n)=\lfloor\frac{n}{i}\rfloor\) 当 \(i\) 从 \(1\) 增大到 \(n\) 时,ta的值最多只会变化\(2\sqrt n\)次,而且是一直变小的

首先把思路反一下,将它变成一道算贡献的题目,刚开始 \(G_j\) 全都是 \(1\) ,枚举每对 \(a_i,b_i\) 和每个\(G_j\) ,每个 \(G_j\)都乘上 \(f(i,j)\),根据整除分块,\(f\) 的值一共最多只会变化\(4\sqrt n\)次,也就是说其实对于\(i\)一定的\(f\)函数,只有\(4\sqrt n\)种不同的值,如果使用区间乘的话,就只需要乘至多\(4\sqrt n\)个不同的值,也可使用差分

还有一些细节,就是分块的左右端点如何算,首先\(H(n)=n\)时,\(i=1\),\(l_1=1\),对于每个 \(1<i\le n\) 有 \(l_i=r_{i-1}+1\),难点就是如何通过 \(l_i\) 算出 \(r_i\)

整除分块例题

Atziluth's Last Contest. 001题解的更多相关文章

  1. AtCoder Grand Contest 001 题解

    传送门 \(A\) 咕咕咕 const int N=505; int a[N],n,res; int main(){ scanf("%d",&n); fp(i,1,n< ...

  2. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  3. AtCoder Beginner Contest 153 题解

    目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...

  4. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  5. AtCoder Beginner Contest 184 题解

    AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...

  6. M-SOLUTIONS Programming Contest 2020 题解

    M-SOLUTIONS Programming Contest 2020 题解 目录 M-SOLUTIONS Programming Contest 2020 题解 A - Kyu in AtCode ...

  7. AtCoder Beginner Contest 173 题解

    AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...

  8. AtCoder Beginner Contest 172 题解

    AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...

  9. AtCoder Beginner Contest 169 题解

    AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...

  10. AtCoder Beginner Contest 148 题解

    目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...

随机推荐

  1. yb课堂 课程总结

  2. 火山引擎数智平台赋能火花思维,A/B测试加速创新

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群.   在数字化浪潮下,火花思维凭借其对数据驱动的理解与实践,搭上了业务快速增长的快车.这一效果的背后,离不开火花思 ...

  3. [oeasy]python0007-调试程序_debug

    ​ 调试程序 回忆上次内容 ​py​​ 的程序是按照顺序执行的 是一行行挨排解释执行的 程序并不是数量越多越好 kpi也在不断演化 ​ 编辑 写的代码越多 出现的bug就越多 什么是bug 如何找bu ...

  4. odoo 为form表单视图添加chatter功能

    实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如图,给表单新增一个类似聊天的窗口,当记录一些表单活动(本例为自动记录当前记录状态变化) 需求实现 模 ...

  5. python的基本认识

    python的基本认识 初识python: python是一种跨平台的.开源的.免费的.解释型的高级编程语言: python的应用领域十分广泛.如web编程.图像处理.黑客编程.网络爬虫和科学计算等: ...

  6. for循环以及常用的遍历(迭代)用法

    for循环以及常用的遍历(迭代)用法   概念:(概念才是高楼的地基!) for循环是一个计次循环,一般运用在循环次数已知的情况下.通常适用于枚举或遍历序列,以及迭代序列中的元素. 注意*:迭代变量用 ...

  7. nginx灰度发布、网站限速和防盗链

    一.灰度发布(金丝雀发布) 灰度发布时使用比较平稳的过渡方式升级或者替换产品项目的方法统称 主要作用 及时发现项目问题 尽早获取用户反馈的信息,以改进产品 如果项目产生问题,可以将问题影响控制到最小范 ...

  8. Jetpack Compose学习(12)——Material Theme的主题色切换

    原文:Jetpack Compose学习(12)--Material Theme的主题色切换-Stars-One的杂货小窝 闲着无事研究了下Jetpack Compose M3 主题切换效果 本系列以 ...

  9. JSR303统一校验使用

    JSR303也称为bean validation,定义了一套bean验证规范.通过注解的方式关联属性与规则 使用方式 1.引入依赖 <dependency> <groupId> ...

  10. RHCA rh442 001 调优本质 调优方法 监控

    调优是一种感知 调优按照成本和性能 一.架构及调优 二.代码及调优 三.配置类调优 从调优效果和成本成正比 设计电商,日访问百万级,未来可能千万级 数据库 系统 服务器多少台 缓存 appache,n ...