一道很好的EZOI模拟赛的题
忘了原题了……
【题目描述】
有两个集合 X 和 Y , 每个集合中有 n 个正整数元素, 分别为 1 , 2 , .....n.。现在要从这两个集合中各选一个元素, 并要求这两个元素的乘积小于等于 n.
求选这两个元素的方案数.
【数据范围】
对于 30% 的数据,n<=500.
对于 50% 的数据,n<=5000.
对于 70% 的数据,n<=10^6.
对于 100% 的数据,n<=10^10; T<=300
思路:
首先想到的思路显然是O(T n^2),显然不行
手算想一想发现O(T n)做法,即 ans= n / 1 + n / 2 + .......+ n / n-1 + n / n
但其实这个是过不了70%数据的,、
再想一下发现后 n / 2 个都是1,所以复杂度变成:O(T n/2),勉勉强强能过70%
对于100%的数据,
听说是一种叫数论分块的东西,不大会……还是说说我自己的思路:
推一会发现一些性质:
1.方案数只有√n z种不同
2.对于前tmp个数,第 i 个数的方案数-第 i+1个方案数 就是在√n 之后的,方案数为 i 的个数
3.tmp的定义:如果 √n * √n(都是向下取整后的)> n - √n,则tmp=√n -1;否则为 √n
数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
方案数:15 7 5 3 3 2 2 1 1 1 1 1 1 1 1
所以可以通过tmp次循环,累计 n / i 的同时算出对应的 tmp之后的方案数
这样我们就得到了O(T √n)的做法
但是还有一个更神的!!(sts树套树大爷%%%%%)
我们发现方案数 y 和数 x 成反比例(画个图)
所以乘积<=n的方案数,实际上是(以x为横轴,y为纵轴,第一象限)反比例图像下方,1--n 范围内整点的个数,就是面积
反比例图像上的每个点都为n
从1 循环到 √n,每次sum累计 n / i ,这样得到的就是1--√n的面积,
之后sum*2-√n*√n,得解
(sts树套树大爷%%%%%)