【技♂巧】bzoj1257余数之和

来源:互联网 发布:iphone库存软件 编辑:程序博客网 时间:2024/05/24 06:04

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1257
题目大意:

这里写图片描述

最近在学数论这种东西……

分析可得:
这里写图片描述

然后呢?
对于N>K的部分,K mod i等于K
剩下的部分,由于K/i是向下取整的,所以K/i的值共有sqrt(k)种,分别是1,2,3,4……k
然后可以把k/i相同的项提取出来,剩下的sum=(l)+(l+1)+(l+2)+(l+3)……+(r-1)+(r),由于是个等差数列可以直接得出公式sum=(r-l+1)l+(r-l+1)(r-l)/2

代码:

#include <iostream>#define ll long longusing namespace std;int main(){    ll n,k,ans = 0;    cin >> n >> k;    if(n >= k)    {        ans = k * (n-k);        n = k-1;    }    for(ll i = 1;i <= n;i ++)    {        ll lst = k/(k/i);        if(lst > n)            lst = n;        ans += k*(lst-i+1) - (k/i)*(lst+i)*(lst-i+1)/2;        i = lst;    }    cout << ans << endl;    return 0;}
1 0