BZOJ 1257 计数

来源:互联网 发布:信用卡淘宝套现方法 编辑:程序博客网 时间:2024/06/11 06:41

题意:给出正整数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。

f(n,k)=ni=1k%i=ni=1kk/i=nkni=1k/i
这个公式是可以在O((n))时间内分块计数的。

#include <bits/stdc++.h>using namespace std;typedef long long LL;LL n, k;int main() {    scanf("%lld%lld", &n, &k);    LL last = 0;    LL res = k * n;    for(int i = 1; i <= n; i = last + 1) {        if(k/i==0) break;        last = k / (k / i);        last = min(last, n);        LL v = k / i;        res -= v * (last - i + 1) * (last + i) / 2;    }    printf("%lld\n", res);    return 0;}
原创粉丝点击