码迷,mamicode.com
首页 > 其他好文 > 详细

整除分块

时间:2020-02-24 13:09:30      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:class   快速   iostream   for   求和   cin   name   直接   方法   

整除分块

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

整除分块

标签:class   快速   iostream   for   求和   cin   name   直接   方法   

原文地址:https://www.cnblogs.com/XJack/p/12356382.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!