hdu5288 多校

来源:互联网 发布:linux命令行上网 编辑:程序博客网 时间:2024/05/29 13:15

题意:f(l,r)表示i的数量,i满足(l=<i<=r)且没有不存在任何一个j,j!=i,且ai mod aj=0;求那个题目中的公式结果。题意还是挺好理解,不理解的可以看看样例画画就知道了。


思路:假设有一个序列元素为 a b c d e f;且a,f是d的因数,bce都不是d的因数。则在bcde这个区间段,任意包含d的区间d都是可以贡献一个答案值的,比如本例中bcd bcde cd cde de d 这6个序列中计算f(l,r)函数时d都是可以一个统计量。所以对于每一个数组中的元素只需找到其左右最靠近的因数在哪个位置即可。若ai在数组下标为i,且ai前最近的因数位置在l,ai后最近的因数是r,那么ai总共可以贡献的统计量为(i-l)*(r-i);现在的问题是如何快速确定每一个数的最近左因数和最近右因数。可以从左往右扫描数组,比如扫描到ai时,1*ai,2*ai,3*ai......j*ai(j*ai<10000因为数据范围就到10000)的l都要修改为i,对于r的确定当然就是从右往左扫描,解决详看代码

http://paste.ubuntu.com/11918563/


0 0