BZOJ1257: [CQOI2007]余数之和sum

【传送门:BZOJ1257


简要题意:

  给出一个整数n,k,求出k%1+k%2+k%3+...+k%n的值 


题解:

  看到这道题,暴力!!这是不可能的,n和k最大十亿(一脸懵逼),结果发现可以分块加速,把式子化成=k*n-Σi*(k/i)(1<=i<=n)


参考代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long LL;
int a[1100000];
int main()
{
    LL n,k;
    scanf("%lld%lld",&n,&k);
    LL ans=n*k;
    //ans=k*n-sigma(i*floor(k/i))
    n=min(n,k);
    int last=0;
    for(int i=1;i<=n;i=last+1)
    {
        last=min(n,k/(k/i));
        ans-=(k/i)*(i+last)*(last-i+1)/2;
    }
    printf("%lld
",ans);
    return 0;
} 
渺渺时空,茫茫人海,与君相遇,幸甚幸甚
原文地址:https://www.cnblogs.com/Never-mind/p/7531771.html