题意很繁琐..转化过来基本就是在平面上给一个半径为n的圆,求圆内有多少个点和圆外至少一个点的欧几里得距离恰好为1。想一下会发现四个象限其实是对称的,求一个象限的解*4就行,对一个象限内的点,发现一个象限内也可以分成两半,所以就是枚举出来1/8个圆的点就可以了...以第一象限为例的话,枚举的结束条件就是x>y。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
ll n,ans,m;
ll ss(ll x,ll y)
{
return x*x+y*y;
}
int main()
{
cin>>n;
if (n==0) cout<<1<<endl;
else if (n==1) cout<<4<<endl;
else
{
ll x=0,y=n;
for (x=0; x<n,x<=y; x++)
{
while (ss(x,y)>n*n) y--;
if (x>y) break;
if (x!=y) ans+=2;
else ans++;
}
ans-=2;
ans=ans*4+4;
cout<<ans<<endl;
}
return 0;
}

本文解决在平面中给定半径为n的圆内求解有多少个点与圆外至少有一个点的欧几里得距离恰好为1的问题。通过分析对称性,简化计算到每个象限的四分之一部分,进一步优化至八分之一部分进行枚举求解。
2445

被折叠的 条评论
为什么被折叠?



