http://codeforces.com/contest/393/problem/C
题意:给出以原点为圆心的圆的半径
n
n
n,求圆内最外圈的整点(相邻点之间欧式距离为1)的个数,
0
≤
r
≤
4
e
7
0≤r≤4e7
0≤r≤4e7。
参考奆佬博客:https://blog.csdn.net/u013081425/article/details/19475015
最简单的想法是圆内整点问题的简单相减,即设以原点为圆心的圆的半径为
r
r
r,圆内整点的个数为
N
(
r
)
N(r)
N(r),则
N
(
r
)
=
1
+
4
⌊
r
⌋
+
4
∑
i
=
1
⌊
r
⌋
⌊
r
2
−
i
2
⌋
N(r)=1+4 \lfloor r \rfloor+4 \sum^{ \lfloor r \rfloor}_{i=1}\lfloor \sqrt{r^2-i^2} \rfloor
N(r)=1+4⌊r⌋+4i=1∑⌊r⌋⌊r2−i2⌋
本题所求的答案
a
n
s
ans
ans就可表示成
a
n
s
=
{
1
,
n
=
0
N
(
n
)
−
N
(
n
−
1
)
,
n
≥
1
ans=\begin{cases} 1,n=0 \\N(n)-N(n-1),n≥1 \end{cases}
ans={1,n=0N(n)−N(n−1),n≥1
但是算
N
(
r
)
N(r)
N(r)的时间复杂度是
O
(
n
)
O(n)
O(n)的,这个题的
r
r
r是
4
e
7
4e7
4e7刚好卡掉会T。
所以打表找规律发现答案除以4之后数列是1, 2, 4, 5, 7, 8, 9, 11, 12, 14, 15, …
oeis一下http://oeis.org/A001951
竟然公式就是
a
n
s
=
{
1
,
n
=
0
4
⌊
2
n
⌋
,
n
≥
1
ans=\begin{cases} 1,n=0 \\4\lfloor \sqrt2 n \rfloor,n≥1 \end{cases}
ans={1,n=04⌊2n⌋,n≥1
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int main()
{
scanf("%d",&n);
if(n==0) printf("1\n");
else printf("%d\n",4*(int)(n*sqrt(2.0)));
return 0;
}
附求圆内整点的函数代码:
long long N(int x)
{
long long res=0;
for(int i=1;i<=x;i++)
res+=sqrt(x*x-i*i);
return res*4+1+4*x;
}