bzoj 1257: [CQOI2007]余数之和sum

来源:互联网 发布:excel筛选数据后复制 编辑:程序博客网 时间:2024/06/03 15:07

Description

给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

Input

输入仅一行,包含两个整数n, k。

Output

输出仅一行,即j(n, k)。

Sample Input

5 3

Sample Output

7

HINT

50%的数据满足:1<=n, k<=1000 100%的数据满足:1<=n ,k<=10^9


solution

  • 根据题目可以写出ans=i=1nk%i

  • 首先知道一点 a%b 可以表示为 abab,写过高精取模的人应该都知道

  • 所以ans=i=1nkiki=nki=1niki

  • ki可以除法分块

  • 对于ki相同的一部分,可以用等差数列求和公式来求

  • 假设在相同的一块内ki=x,把 x 提出来那一块的答案就是x(i+i+1+)

  • 里面是差为1的等差数列,所以就可以用等差数列求和公式

code

#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;int main() {    ll n,k;    scanf("%lld%lld",&n,&k);    ll ans=n*k;    for(ll l=1,r;l<=n;l=r+1) {        if(k/l!=0) r=min(k/(k/l),n);         else r=n;        ans-=(k/l)*(r-l+1)*(l+r)/2;    }    printf("%lld",ans);    return 0;}
原创粉丝点击