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\n",ans); return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚