对于两点在同圆上的情况,可以证明最优路径一定是两点之间的劣弧和中心点与两点之间的两条线段这两种情况之一。如果两点之间的劣弧隔了 x-1 个点,或者说 x 段长度为 \frac{\pi r}{m} 的弧,那么两种情况的代价分别是 \frac{x\pi r}{m} 和 2r。不难发现哪种更优仅与 x 有关。由此,设 k 表示当 x\geq k 时后者更优,否则前者更优。此处的 k 可以在 O(1) 的时间复杂度内求得其值为 \lceil\frac{2m}{\pi}\rceil。
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
using namespace std;
int main() {
long long n, m;
scanf("%lld %lld", &n, &m);
if (m == 1) {
printf("%lld\n", n * n - n * (2 * n - 1) * (4 * n - 1) / 3 + 2 * n * n * (2 * n - 1));
return 0;
}
long long k = ceil(2 * m / M_PI);
long long p = n * (n + 1) * (2 * n + 1) / 6 * k * (k - 1);
long long q = m * n * (n + 1) * (3 * (n + 1) + 2 * (2 * n + 1) * (m - k) + (n - 1) * (2 * m - 1)) / 3;
printf("%.10lf\n", p * M_PI + q);
return 0;
}