【CQOI2007】余数求和

题面

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

输入样例#1:
10 5
输出样例#1: 
29

30%: n,k <= 1000

60%: n,k <= 10^6

100% n,k <= 10^9

分析

考试遇到过,手推失败

lyd蓝书上重逢,虽然看着真的很头疼,还是大概地啃下来了,花了2h+(菜是原罪)

公式太难打了,我放弃,上手写,字丑,时间紧,地铁上写的

将就看了,基本是按照lyd的思路

 

代码

#include<bits/stdc++.h>
using namespace std;
long long n,k,l,r,ans;
int main()
{
    cin>>n>>k;
    ans=k*n;
    for(l=1,r;l<=n;l=r+1)
    {
        r=k/l?min(k/(k/l),n):n;
        ans-=(r-l+1)*(k/l)*(l+r)/2;
    }
    cout<<ans;
    return 0;
}

 

posted @ 2018-10-01 00:02  WJEMail  阅读(105)  评论(0编辑  收藏  举报