[BZOJ1257][CQOI2007]余数之和:数论分块

分析:

x mod y 可以表示为 x-[x/y]*y 。
按照这个将原式变形就可以数论分块搞了。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL n,k;
int main(){
    scanf("%lld%lld",&n,&k);
    LL ans=n*k,nxti;
    for(LL i=1;i<=min(n,k);i=nxti){
        nxti=k/(k/i)+1;
        if(nxti>n) nxti=n+1;
        ans-=(k/i)*(i+nxti-1)*(nxti-i)/2;
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ErkkiErkko/p/9609962.html