当前位置: 代码迷 >> 综合 >> 紫书 例题 10-25 UVa 1363(找规律)
  详细解决方案

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

热度:13   发布时间:2023-09-20 20:48:26.0

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

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

为商数的等差数列。

利用这个性质求解即可。

#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;
}