About Problem
- The web : http://www.lydsy.com/JudgeOnline/problem.php?id=3930
- The tab : 递推, CQOI
Solve
- 首先定义状态 f[i] 为在区间 [l , r] 中,选 n 个数,这 n 个数的 gdc 为 i*k 的方案数。
那么在 [1 , l] 中一共有⌈l / (i*k)⌉ 个 i*k 的倍数,同理有 r / (i*k) 个 i*k 的倍数在 [1 , r] 之间。
设 a = ⌈l / (i*k)⌉, b = r / (i*k)
所以一共的方案数为 (b-a+1)^n。 - 但这中间会有一部分不合法的方案,例如:
1.设 k∈[l , r],那么会选出 {k,k,k,k...k,k,k} (n 个 k 这样的集合,这很显然是不合法的=.=)
所以一共要去掉 (b-a+1) 个方案。
2.k*2*i 是 ki 的倍数,k*4*i 也是 ki 的倍数,但这两个的 gcd 明显不是 ki 而是 2ki,所以显而易见要把gcd为 2ki,3ki,4ki,5ki ... 的余数给去掉
在去重的过程中不会出现第二种情况包含第一种情况,因为 gcd 为 2ki 的方案中也不会包含重复出现的形如 {x,x,x...,x,x}(n 个 x,且 2ki|x ),所以第二种情况去掉的只是新添加的情况[不知道你们看不看得懂,,,反正我是看不懂自己写的,反正就是情况2和情况1不会有交集吧]
综上:
Maxn可以任选(当然如果你有闲心推一下上界的话也不错,记得在评论里告诉我ZZZ,我很懒,所以我是蒟蒻)
各位大神 OOOOrrrzz
代码:Github传送门 嗖~
当然这道题的正解貌似是莫比乌斯反演,然而我还懒得学=.=有时间再看一下吧,在友链中贴出一个我认为写得好的的Blog,有兴趣的可以看一下。
友链:
思路来源:http://www.cnblogs.com/tuigou/p/4620242.html
莫比乌斯反演:http://blog.csdn.net/popoqqq/article/details/44917831
犇OOOOrrrzz
----------------------------------------------- gdjs2 --------------
--------------------------------------------- 2016.3.13 ------------