P2261
原来可以用分块啊
水灵灵的做法:
#include <bits/stdc++.h>
using namespace std;
int main() {
    long long n,k;
    scanf("%lld%lld",&n,&k);
    long long ans=n*k;
    for(long long l=1,r;l<=n;l=r+1) {
        if(k/l!=0) r=min(k/(k/l),n); //关键:如果它会减小x次,那么x值为当前l的有k/(k/l)个,原因自己想
        else r=n;//易得
        ans-=(k/l)*(r-l+1)*(l+r)/2;//等差数列(doge
    }
    printf("%lld",ans);
    return 0;
}

                
            
        
浙公网安备 33010602011771号