给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值。
例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7。
输入格式
输入仅一行,包含两个整数n, k。
输出格式
输出仅一行,即j(n, k)。
数据范围
1≤n,k≤1091≤n,k≤109
输入样例:
5 3
输出样例:
7
思路:
求 k%i(i~n)的和,由于数据量特别大,
已知 p =k/i, q= k/p;
q表示 大于 i的(p-1)倍,小于i的(p+1)倍的个数
f = k%i;
g = k %min(q,n);
q个数字是等差数列,公差为一
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n,k;
ll sum =0;
int main()
{
cin >> n >> k;
for(ll i=1,j;i<=n;i=j+1)
{
ll p = k/i;
if(p ==0)j=n;
else j = min(k/p,n);
ll f= k%i;
ll t =k%j;
sum+=(j-i+1)*(f+t)/2;
}
cout << sum <<endl;
return 0;
}
你的脸上风淡云轻,谁也不知道你的牙咬得有多紧。你走路带着风,谁也不知道你膝盖上仍有曾摔过的伤的淤青。你笑得没心没肺,没人知道你哭起来只能无声落泪。要让人觉得毫不费力,只能背后极其努力。我们没有改变不了的未来,只有不想改变的过去。
你的脸上风淡云轻,谁也不知道你的牙咬得有多紧。你走路带着风,谁也不知道你膝盖上仍有曾摔过的伤的淤青。你笑得没心没肺,没人知道你哭起来只能无声落泪。要让人觉得毫不费力,只能背后极其努力。我们没有改变不了的未来,只有不想改变的过去。