关于模考 T2
今天做到模考的 T2,太有意思了。
题目描述
最近,Bob 学习了整数除法。受到这一神圣知识的启发,他决定进一步了解满足某些整除条件的正整数数组。具体来说,Bob 将一个数组 \(a=a_1,a_2,\dots,a_n\) 称为"好数组",当且仅当对于每个 \(i\)(从 \(1\) 到 \(n-1\)),\(a_i\) 能被 \(a_{i+1}\) 整除。请帮助他计算长度为 \(n\) 且所有元素不超过 \(c\) 的好数组的数量。
输入格式
输入只有一行,包含两个整数 \(n\) 和 \(c\)——数组的长度和允许的最大值。
输出格式
输出一个整数——长度为 \(n\) 且所有元素为不超过 \(c\) 的正整数的好数组的总数。由于这个数可能非常大,请输出其对 \(998244353\) 取模的结果。
样例
Input 1
3 3
Output 1
7
Input 2
2 6
Output 2
14
样例解释
对于第一个数填 \(1\sim 6\),分别有 \([6,3,2,1,1,1]\) 种第二个数,故总共有 \(14\) 种。
数据范围
对于 \(10\%\) 的数据满足:\(1\le n,c\le 10\)。
对于 \(50\%\) 的数据满足:\(1\le n,c\le 10^5\)。
对于 \(100\%\) 的数据满足:\(1\le n,c\le 5\times 10^7\)。
我的解法
这道题目的时间限制为 \(2\) 秒,空间限制为 \(1048576\ \mathrm{kB}\)。
注意数据范围,可知我们需要一个线性复杂度。
我们可以设 \(a_n=k\),那么我们就有 \(k\mid a_i\ (1\le k\le n)\),那我们不妨得到一个新的数列 \(b\) 使得 \(b_i=\frac{a_i}{k}\)。
那么原本的问题就转化为了 \(b_n=1\) 且 \(b_{i+1}\mid b_i\ (1\le i<n)\) 且 $1\le b_1\le \left \lfloor \frac{c}{k}\right \rfloor $。
那么,由于 \(b_n=1\),我们只需要考虑剩下 \(n-1\) 个数即可,易见 \(b_1\) 为 \(b\) 数列中其它所有数的倍数,我们不妨考虑,将 \(b_n\) 分解为 \(n-1\) 个数的乘积。
我们假设 \(\mathrm{f}(x)\) 代表将 \(x\) 分解为 \(n-1\) 个数的乘积的方案数。
那么,我们简化后的问题的答案就为:
\]
然后,由于我们上面的 \(k\) 的范围为 \(1\le k\le c\),所以最后的答案就是:
\]
那么问题就变成了,用线性复杂度求出 \(\mathrm{f}(x)\) 的大小,把这个问题解决了,其它就都好办了。
我们考虑分解 \(x\):
\]
那么,我们使用插板法即可得到:
\alpha_j+n-2 \\n-2
\end{pmatrix}\]
然后,我们应该是可以证明 \(\mathrm{f}(x)\) 为积性函数的。
具体的,我们需要证明当 \(\gcd(a,b)=1\) 时,\(\mathrm{f}(a\times b)=\mathrm{f}(a)\times \mathrm{f}(b)\)。
我们考虑 \(\mathrm{f}(a\times b)\) 这个函数的值为 \(\prod_{i=1}^{n-1}c_i=a\times b\) 的 \(k\) 元组 \((c_1,c_2,\dots,c_{n-1})\) 的数量。
由于 \(\gcd(a,b)=1\) 所以我们可以唯一分解 \(c_i=d_i\times e_i\),并且 \(d_i\mid a,e_i\mid b\) 且 \(\gcd(d_i,e_i)=1\),则:
\]
接下来,我们只需要证明 \(\prod_{i=1}^{n-1}d_i=a,\prod_{i=1}^{n-1}e_i=b\) 即可。
我们取任意质数 \(p\):
- 若 \(p\mid a\),则 \(p\nmid b\),此时 \(v_p(a\times b)=v_p(a)+v_p(b)=v_p(a)\),又因为 \(v_p(c_i)=v_p(d_i)+v_p(e_i)\),但是 \(e_i\mid b\) 所以 \(v_p(e_i)=0\),所以 \(v_p(c_i)=v_p(d_i)\),因此:
\]
- 若 \(p\mid b\),与上面同理可得 \(v_p\left(\prod_{i=1}^{n-1}e_i\right)=v_p(b)\)。
- 若 \(p\nmid a\times b\),那么 \(v_p\left(\prod_{i=1}^{n-1}d_i\right)=0=v_p(a),v_p\left(\prod_{i=1}^{n-1}e_i\right)=0=v_p(b)\)。
所以,对于所有的质数 \(p\),都有 \(v_p\left(\prod_{i=1}^{n-1}d_i\right)=v_p(a)\) 和 \(v_p\left(\prod_{i=1}^{n-1}e_i\right)=v_p(b)\),所以 \(\prod_{i=1}^{n-1}d_i=a,\prod_{i=1}^{n-1}e_i=b\)。
然后,这道题目就好做了,我们考虑使用线性筛求 \(\mathrm{f}(x)\),我们考虑两种情况当前的数为 \(i\),质数为 \(p_i\)。
若 \(p_i\mid i\),则我们推一下式子,就是我们设 \(i=p_i^k\times m\) 那么现在的 \(i\times p_i=p_i^{k+1}\times m\),我们用我们上面的表达式写出来,也就是 \(\mathrm{f}(i)=\begin{pmatrix}k+n-2\\n-2\end{pmatrix}\times \mathrm{g}_{m},\mathrm{f}(i\times p_i)=\begin{pmatrix}k+n-1\\n-2\end{pmatrix}\times \mathrm{g}_{m}\),我们那么我们将这两个式子做比,就能得到:
\]
所以,我们可以得到 \(\mathrm{f}(i\times p_i)=\mathrm{f}(i)\times\frac{k+n-1}{k+1}\),这里我们用乘法逆元做就可以了。
第二种情况就是,若 \(p_i\mid i\) 那么,由于 \(\mathrm{f}(x)\) 为积性函数,所以 \(\mathrm{f}(i\times p_i)=\mathrm{f}(i)\times \mathrm{f}(p_i)\)。
然后,这道题目就基本做完了,我们只需要再加一点细节就够了。
关于积性函数证明中的解释
我们的证明过程中出现了一种符号,叫做 \(p\) 进赋值,它的定义为 \(v_p(x)=\max\left\{k\in \mathbb{N}_0\ |\ p^k\mid x \right\}\),其中 \(\mathbb{N}_0\) 代表非负整数集。
它有一个性质:
- 若 \(p\nmid x\),则 \(v_p(x)=0\)。
- 对于任意正整数 \(a,b\) 和质数 \(p\) 有 \(v_p(a\times b)=v_p(a)+v_p(b)\)。
还有一些性质,就不一一列举了,我们的证明中用到了如上两个性质。
后记
这模考 T2 咋还是原题呀:link。
其实这道题目不证明积性函数也能做,主要由 wzr 巨佬提供,原因是在和 wzr 讨论这道题目的时候,wzr 说这个函数绝对不是积性函数,于是不用积性函数做出了这道题目。不过这道题目怎么还卡空间呢?
不过也有可能是作者错了,如有错误,请指出。
关于模考 T2的更多相关文章
- [Noip2016]蚯蚓 D2 T2 队列
[Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯 ...
- T2 Func<in T1,out T2>(T1 arg)
委托调用方法的4种方式. using System; using System.Collections.Generic; namespace ConsoleApplication1 { delegat ...
- Hotelling T2检验和多元方差分析
1.1 Hotelling T2检验 Hotelling T2检验是一种常用多变量检验方法,是单变量检验的自然推广,常用于两组均向量的比较. 设两个含量分析为n,m的样本来自具有公共协方差阵的q维正态 ...
- bzoj4034: [HAOI2015]T2
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2684 Solved: 843 Description 有一 ...
- 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数
本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...
- NOIP欢乐模拟赛 T2 解题报告
小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...
- Action<T1, T2>委托
封装包含两个参数的方法委托,没有返回值. 语法 public delegate void Action<in T1, in T2>( T1 arg1, T2 arg2 ) 类型参数 in ...
- NOIP2013普及组 T2 表达式求值
OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...
- 有三个线程T1 T2 T3,如何保证他们按顺序执行-转载
T3先执行,在T3的run中,调用t2.join,让t2执行完成后再执行t3 在T2的run中,调用t1.join,让t1执行完成后再让T2执行 public class Test { // 1.现在 ...
- 现在有T1、T2、T3三个线程,怎样保证T2在T1执行完后执行,T3在T2执行完后执行?使用Join
public class TestJoin { public static void main(String[] args) { Thread t1 = new Thread(new T1(), &q ...
随机推荐
- QUBO建模
技术背景 QUBO(Quadratic Unconstrained Binary Optimization)模型是一种常用于求解组合优化问题的一种技术,它所能够求解的问题是这样定义的:给定一个布尔类型 ...
- sonarqube+gitlab+jenkins+maven集成搭建(一)
一SonarQube介绍SonarQube 是一个开源的代码分析平台,用来持续分析和评测代码的质量,支持检测 Java . JavaScript .C#.C.C++ 等二十几种编程语言.通过 Sona ...
- StarBlog和Masuit.MyBlogs博客程序学习使用日记(一)
最近买了个简单的服务器,想着搞点花活,就去找了找网上的开源代码,感谢大佬的开源库:(https://gitee.com/ysgdaydayup/DotNetGuide) 在上面有列开源的博客框架,我是 ...
- 安装MVN出现 Error: JAVA_HOME is set to an invalid directory.的解决方法
出现 Error: JAVA_HOME is set to an invalid directory.的解决方法 解决: 将JAVA_HOME = "D:/Java/jdk1.6.0_12/ ...
- RabbitMQ消息的生存时间TTL(Time To Live)
目录 RabbitMQ消息的生存时间TTL MQ环境测试准备 代码实现 生产者 8080 测试 死信队列 自定义ttl消息 过期丢弃消息 总结 RabbitMQ消息的生存时间TTL TTL(Time ...
- c#开发完整的Socks5代理客户端与服务端(已完结)
本文我们介绍下如何在Windows系统上开发一个代理本机流量的客户端,并且对接我们之前开发的Socks5服务端,实现整个代理的一条龙.对于Socks5代理的服务端的开发可以详见之前的文章. 目录 本机 ...
- SQL 强化练习 (五)
果然日常练练这些 sql 是非常有必要的, 这几日的报表开发, 用一款过程软件 fineReport, 相对于我之前用 Tableau 来做报表, 这个帆软, 确实更加适合中国人哦, 而Tableau ...
- Python 面向对象 之 @property
Python 面向对象 之 Property 初识 @property Property 是 Python 类的一个内置的 装饰器. @property 的作用是 将一个方法, 变为属性来调用. 装饰 ...
- 王炸!SpringBoot+MCP 让你的系统秒变AI小助手
王炸!SpringBoot+MCP 让你的系统秒变AI小助手 感觉本篇对你有帮助可以关注一下我的微信公众号(深入浅出谈java),会不定期更新知识和面试资料.技巧!!! 一.MCP 是什么? MCP( ...
- C++/Python混合编程
以 C++ 为底层基础,Python 作为上层建筑,共同搭建起高性能.易维护.可扩展的混合系统. Python 本身就有 C 接口,可以用 C 语言编写扩展模块,把一些低效耗时的功能改用 C 实现,有 ...