Atziluth's Last Contest. 001题解
被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题解的更多相关文章
- AtCoder Grand Contest 001 题解
传送门 \(A\) 咕咕咕 const int N=505; int a[N],n,res; int main(){ scanf("%d",&n); fp(i,1,n< ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 153 题解
目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- AtCoder Beginner Contest 184 题解
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
- M-SOLUTIONS Programming Contest 2020 题解
M-SOLUTIONS Programming Contest 2020 题解 目录 M-SOLUTIONS Programming Contest 2020 题解 A - Kyu in AtCode ...
- AtCoder Beginner Contest 173 题解
AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...
- AtCoder Beginner Contest 172 题解
AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...
- AtCoder Beginner Contest 169 题解
AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...
- AtCoder Beginner Contest 148 题解
目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...
随机推荐
- Spring Cloud提供者actuator依赖
<!-- actuator依赖 --> <dependency> <groupId>org.springframework.boot</groupId> ...
- 基于Redis在定时任务里判断其他定时任务是否已经正常执行完的方案
执行的定时任务是基于其他定时任务计算得到的结果基础上做操作的,那么如何来确定其他存在数据依赖的定时任务已经执行完成呢? 在分布式环境里,可通过集群的redis来解决这个问题: 即,在跑批任务开始时,将 ...
- SQL注入漏洞攻击
l-> 对于用户登录的实现,提供SQL语句 •-> select * from 表名 where uid=- and pwd=- •-> 使用字符串拼接 l-> 提供密码为:' ...
- 【算法】用c#实现计算方法中的经典降幂优化策略,减少计算复杂度
对于给定的数组[x1,x2,x3,-,xn],计算幂的累积:x1^(x2^(x3^(-^xn))的最后一位(十进制)数字. 例如,对于数组[3,4,2],您的代码应该返回1,因为3^(4^2)=3^1 ...
- <el-table-column prop="item_no" label="料号"/>设置最小宽度
可以通过min-width属性来设置el-table-column的最小宽度.以下是一个示例: <template> <el-table :data="tableData& ...
- GUN/Linux 基础教程
GUN/Linux 基础教程 控制台 shell 超级用户 root 辅助管理 CLI 软件 文件基础 目录 链接 设备文件 控制台 shell 在启动 Linux 系统后,如果没有安装 GUI 的话 ...
- JAVA私有构造函数---java笔记
在Java中,构造函数是一种特殊的方法,它用于初始化新创建的对象.当我们创建一个类的实例时,构造函数会自动被调用. 构造函数可以有不同的访问修饰符,如public.protected.default( ...
- gist.github.com 无法访问解决办法,亲测永远有效!
1.打开https://www.ipaddress.com/,输入gist.github.com获取IP地址 2.ping 此ip地址,可以访问 3.将IP地址写入Hosts文件,140.82.113 ...
- php环境,性能优化
根据宝塔的推荐进行参数修改 我的是8G内存,修改成4G内存 下面是备份:修改前的 ; Start a new pool named 'www'.; the variable $pool can be ...
- Linux podman容器实验
要求 1.登录到指定的镜像仓库拉取镜像 2.以普通用户contsvc运行 3.配置 systemd-journald 服务,要求永久保留日志数据(物理机,创建文件mkdir /var/log/jour ...