首页 > 代码库 > 【YY】second

【YY】second

一道很好的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树套树大爷%%%%%)

【YY】second