紫书 例题 10-25 UVa 1363(找规律)

可以发现余数是成一段一段的等差数列的。

在商数同的时候,余数是成首项为第一个数的余数,公差

为商数的等差数列。

利用这个性质求解即可。

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

long long sum(int a, int d, int n)
{
	return (long long)(2 * a - n * d) * (n + 1) / 2;
}

int main()
{
	int n, k;
	while(~scanf("%d%d", &n, &k))
	{
		int i = 1;
		long long ans = 0;
		while(i <= n)
		{
			int p = k / i, q = k % i;
			int cnt = n - i;
			if(p > 0) cnt = min(cnt, q / p);
			ans += sum(q, p, cnt);
			i += cnt + 1;
		}
		printf("%lld\n", ans);
	}
	return 0;
}

 

posted @ 2018-07-20 10:48  Sugewud  阅读(112)  评论(0编辑  收藏  举报