#include <iostream>
using namespace std;
//这个答案错误
int main()
{
long long n,k,sum = 0,L,R;
cout << "输入j(n,k)的n和k:";
cin >> n >> k;
for (long long i = 1; i <= n;)
{
if (k / i == 0)
{
break;
}
L = i; //k/i相等的左区间默认为第一个数
R = min(n, k/(k/i)); //观察发现右区间为k/(k / i),针对n有可能小于k,运用min函数保证右区间小于等于N
for (long long j = L; j <= R; j++) //给这个区间的就i*k/i求和
{
sum = sum + j * (k / i);
}
i = R + 1;
}
cout << n * k - sum;
return 0;
}
//这个答案正确
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
ll n, k;
cin >> n >> k;
ll sum = n * k; // 通过公式推导出来的,该数为基数,然后减去对应的数就行了。
for (ll i = 1; i <= n;) { // 一共有n个数需要求余累加
if (k / i == 0) break; // 如果k/i等于0,直接结束
ll l = i; // 左边界
ll r = min(n, k / (k / i)); // 右边界如果超过n,就取n
sum -= (k / i) * (l + r) * (r - l + 1) / 2; // sum 减去这一块的值
i = r + 1; // 更新i的值,跳过这一块
}
cout << sum << endl; // 输出结果
return 0;
}
这两个代码的差别就是在求k/i有区间重复时候的求法不同,一个利用公式,一个利用循环,但是我输入了好几个样例来,这两个代码的结果都是一样的,请问为什么