您的位置:首页 > 其它

poj2800

2011-09-13 16:01 260 查看
题意:给出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: