我们要求∑k%i
可以化简为∑n*k-i*(k/i)
所以问题在于如何求∑k/i*i
数据范围1e9,想一想O(n)不可做
加入n=k=15
i= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
k/i=15 7 5 3 3 2 2 1 1 1 1 . . . . . . . . .
所以可以看出k/i是单调递减的,且对于每一段相同的k/i他们的区间是k/(k/i)到k/(k/(i+1))-1,再用等差数列算一下就可以了
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 using namespace std; 5 typedef long long ll; 6 7 int main() { 8 ll n,k; 9 scanf("%lld%lld",&n,&k); 10 ll ans=n*k; 11 for(ll l=1,r;l<=n;l=r+1) { 12 if(k/l!=0) r=min(k/(k/l),n); 13 else r=n; 14 ans-=(k/l)*(r-l+1)*(l+r)/2; 15 } 16 printf("%lld",ans); 17 return 0; 18 }