[洛谷P5174]圆点

题目大意:给你$R(R\leqslant10^{14})$,求:
$$
\sum\limits_{x\in\mathbb{Z}}\sum\limits_{y\in\mathbb{Z}}[x^2+y^2\leqslant R](x^2+y^2)
$$
题解:明显可以发现这是对称的,所以可以只枚举四分之一,并且$x,y\leqslant\sqrt R$。所以式子成了$4\sum\limits_{x=0}^{\sqrt R}\sum\limits_{y=1}^{\sqrt R}[x^2+y^2\leqslant R](x^2+y^2)$。这样就可以暴力枚举了,复杂度$O(R)$。

然后那个判断有点烦,去掉,变成$4\sum\limits_{x=0}^{\sqrt R}\sum\limits_{y=1}^{\sqrt{R-x^2}}(x^2+y^2)$
$$
\begin{align*}
&4\sum\limits_{x=0}^{\sqrt R}\sum\limits_{y=1}^{\sqrt{R-x^2}}(x^2+y^2)\\
=&4\sum\limits_{x=0}^{\sqrt R}(\sqrt{R-x^2}x^2+\sum\limits_{y=1}^{\sqrt{R-x^2}}y^2)\\
\end{align*}\\
令Y=\sqrt{R-x^2}\\
=4\sum\limits_{x=0}^{\sqrt R}(Yx^2+\dfrac{Y(Y+1)(2Y+1))}6)\\
$$

复杂度$O(\sqrt R)$

卡点:

 

C++ Code:

#include <cstdio>
#include <cmath>
const long long mod = 1e9 + 7, mod6 = mod * 6;
long long R, ans;
inline void reduce(long long &x) { x += x >> 63 & mod; }
int main() {
	scanf("%lld", &R);
	for (long long x = sqrt(R), y; ~x; --x) {
		y = sqrt(R - x * x);
		reduce(ans += x * x % mod * y % mod - mod);
		reduce(ans += y * (y + 1) % mod6 * (2 * y + 1) / 6 % mod - mod);
	}
	printf("%lld\n", ans * 4 % mod);
	return 0;
}

  

posted @ 2019-01-12 10:35  Memory_of_winter  阅读(137)  评论(0编辑  收藏  举报