整除分块

Posted xjack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整除分块相关的知识,希望对你有一定的参考价值。

整除分块

整除就是快速求得一个数被一个范围的所有数除的结果之和的一个解决方法
通过随便举一个例子,发现这样的结果大多都会有一些数重复且连续的出现,这时只需求得数量后直接得乘积加到sum里面就可以了

对于被除数k,发现结果i出现的长度其实是 floor(k/(i-1))+1-floor(k/i)
代码过水

附上例题
我谷P2261 [CQOI2007]余数求和代码

#include<iostream>
using namespace std;
long long n,len,sum,k;
int main()
{
    cin>>n>>k;
    for(long long i=1;i<=n;i=k/(k/i)+1){
        if(k/i==0) break;
        len=min(n+1,k/(k/i)+1)-i;
        sum+=(k/i)*((i+i+len-1)*len/2);
    }
    cout<<-sum+k*n;
    return 0;
}

end

以上是关于整除分块的主要内容,如果未能解决你的问题,请参考以下文章

数论分块之整除分块

整除分块

C. Everyone is a Winner!(整除分块)

整除分块

整除分块模板

整除分块小记