1. 程式人生 > >【除法分塊】BZOJ1257 [CQOI2007]餘數之和sum

【除法分塊】BZOJ1257 [CQOI2007]餘數之和sum

題面在這裡

把答案的形式寫出來就是這樣的:

i=1mnnii
nmi=1mnii
可以發現,隨著i的增長,ni是可以分塊的
而且最多有O(n)級別的塊數

示例程式:

#include<cstdio>
#include<cmath>
#define LL long long

LL n,nn,m,ans,a[3162300];
int main(){
    scanf("%lld%lld",&m,&n);nn=sqrt(n);
    ans=n*(m);
    for (int k=1;k<=nn;k++){
        a[k]=n/k;
        LL l=n/(k+1
)+1,r=n/k; if (l>m) continue; if (r>m) r=m; ans-=(k*((l+r)*(r-l+1)/2)); } for (int i=1;i<nn;i++){ LL k=a[i],l=n/(k+1)+1,r=n/k; if (l>m) continue; if (r>m) r=m; ans-=(k*((l+r)*(r-l+1)/2)); } if (n/nn!=nn){ LL k=a[nn],l=n/(k+1
)+1,r=n/k; ans-=(k*((l+r)*(r-l+1)/2)); } printf("%lld",ans); return 0; }