BZOJ 1257 余数之和sum (取模原理+分块)

来源:互联网 发布:linux 复制文件 编辑:程序博客网 时间:2024/06/05 11:41

思路:

考虑取模的原理:k%n=kk/ii
如果你对莫比乌斯反演中的分块很熟悉的话,那么你一眼就能看出来:k/i的值最多只有2*sqrt(k)个,所以我们只需sqrt(n)的时间就可以完成。而且i的前缀和也不需要预处理,直接公式就有了。

#include<stdio.h>#include <iostream>#include<string.h>#include<math.h>#include<algorithm>#define eps 1e-8typedef long long int lli;using namespace std;const int maxn = 1e6+10;int main(){    lli p,q;    lli a,b,k,n;    scanf("%lld%lld",&n,&k);    lli ans = n*k,l,len = min(n,k);    for(lli i = 1;i <= len;i=l+1){        l = min(k/(k/i),len);        ans += -(k/i)*((l+i)*(l-i+1)/2);    }    printf("%lld\n",ans);    return 0;}
原创粉丝点击