poj2800
題意:給出n,k,求k%1 + k%2 + …… + k%n;
分析:當k/i = 1 時, k%i = k - i,隨著i不斷減小1,k-i每次減小1,即k%i每次減小1。當k/i=2時,i減小1,k%i減小2。我們要求k%i的和,可以劃分為許多等差數列的和。
View Code #include <iostream>#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
long long n, k;
int main()
{
//freopen("t.txt", "r", stdin);
while (scanf("%lld%lld", &n, &k) != EOF)
{
long long ans = 0;
if (n > k)
ans = k * (n - k);
int i = 1;
long long a, b;
while (true)
{
a = k / i;
b = k / (i + 1) + 1;
if (a == b)
break;
if (b > n)
{
i++;
continue;
}
if (a > n)
a = n;
ans += (k % a + k % a + (a - b) * i) * (a - b + 1) / 2;
i++;
}
for (i = 1; i <= min(n, a); i++)
ans += k % i;
printf("%lld\n", ans);
}
return 0;
}
總結
- 上一篇: CMMI故事一则
- 下一篇: Android开发学习:在Eclipse