C++ 找到余数相同的部分
#include <iostream>
using namespace std;
int main() {
long long a, b;
cin >> a >> b;
long long s = a*b;
// for (int i=1; i<=a; i++) { // 会超时
// sum k%i = n*k - sum i*(k/i)
long long r = 1;
for (long long i=1; i<=min(a,b); i=r+1) {
long long q = b/i;
r = min(b/q, a);
s -= q*(r+i)*(r-i+1)/2;
}
cout << s;
}
// 64 位输出请用 printf("%lld")
#include <iostream>
using namespace std;
int main() {
long long n;
cin >> n;
// 不是 n*(1+1/2+1/3+……+1/n) 而是 n/i 向下取整
long long s = n;
// for (long long i=2; i<=n; i++) { // 会超时
long long r = 1;
for (long long i=2; i<=n; i=r+1) {
long long q = n/i;
r = n/q; // r个余数为q
// cout << q << ' ' << r << endl;
s += (long long)(r-i+1)*q;
}
cout << s;
}
// 64 位输出请用 printf("%lld")



京公网安备 11010502036488号