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. JavaSe 统计字符串中字符出现的次数

    public static void main(String[] args) { // 1.字符串 String str = "*Constructs a new <tt>Has ...

  2. C# 日期帮助类

    using System; using System.Data; namespace Erp.Ship.Tool { [Serializable] public enum DateInterval { ...

  3. C++ Constructor And Destructor

    if you have problems with constructors and destructors, you can insert such print statements in cons ...

  4. SpringBoot+Mybatis整合出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)的解决

    在搭建自己的后台管理,遇到一个比较小问题,顺便记录了一下. 启动SpringBoot后台时,前端访问后台执行Mybatis时,出现了这样的报错: org.apache.ibatis.binding.B ...

  5. 基于Docker安装项目管理工具禅道

    禅道是通用的项目管理软件 完整支持敏捷项目模型.瀑布项目模型.看板模型 内置项目集.产品.项目和执行四个管理框架 支持CMMI标准的落地实施 下载镜像 docker pull easysoft/zen ...

  6. Vue this.$refs的使用

    ref 写在标签上时:this.$refs.名字 获取的是标签对应的dom元素 ref 写在组件上时:这时候获取到的是子组件的引用

  7. 深入探讨Spring Boot中的参数传递

    深入探讨Spring Boot中的参数传递 在Spring Boot开发中,参数传递是一个非常常见且重要的操作.无论是处理HTTP请求,还是在方法之间传递数据,理解和掌握参数传递的各种方式都能让我们的 ...

  8. 对比python学julia(第四章:人工智能)--(第四节)绘画大师

    1.1.  项目简介 所谓图像风格迁移,是利用深度学习技术,将一幅风格图像输人卷积神经网络提取风格特征,再将其应用到另一幅内容图像上,从而生成一幅与风格囝像相仿的新图像.如果选取绘画大师的作品作为风格 ...

  9. 【SpringMVC】 Controller接收深度复杂对象封装不到的问题

    首先来看数据结构的定义: 一个Form对象,然后里面有一个排版日期对象的List集合 排班集合的每个元素中又有一个String集合 在前端的Post请求中可以看到这个String集合是传递了的 但是D ...

  10. 【SpringCloud】 Re01

    简单理解 接口跨服务调用 说白了 就是原来只是调用一个接口就能得到资源,现在是调用两个或者更多接口,这些接口来自不同的服务 (从前端的角度来看依然只是调用这个接口,只是这个接口背后又去调用其他的接口了 ...