对于ki\dfrac{k}{i}ik相等的集合中kmod ik\mod ikmodi的解是呈等差数列的,所以可以将for(int i=1;i<=k;i++) ans += k%i;分成求解k\sqrt{k}k个等差数列的和,这就是分段
for(int i=1;i<=k;i++) ans += k%i;
附本题代码-----------------------------------------------------------------------------------------------------------.
123456789101112131415161718
LL a,b,ans;void work(){ ans = 0; cin>>a>>b; if(a>b) ans +=(a-b)*b,a=b; for(int i=1,j;i<=a;i=j+1){ j=b/(b/i); if(j>=a) j=a; ans+=(LL)(j-i+1)*b-(LL)(j-i+1)*(i+j)/2*(b/i); //i~j就是一个块 } cout<<ans<<endl;}int main(){ work(); return 0;}