【POJ3090】Visible Lattice Points
题意
按下图方式连线,能连多少条?多组数据。N<=1000
分析
从图上可以看出来,除了连上(1,1)(1,0)(0,1)的那三条,其他连线的点都是满足x和y互质
而且左右两部分是关于y=x对称的,不妨只看一半。比如只看上面一半,根据线性规划思想,上面一半y>x
所以其实在求对于每个y,小于y且与y互质的数的个数,这不就是phi吗???
所以答案就是 ∑phi[i]*2+3
代码
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; #define N 2010 int t,n,cnt; int v[N],s[N],phi[N],prime[N]; void primes(int n) { for(int i=2;i<=n;i++) { if(!v[i]) { prime[++cnt]=i; v[i]=i;phi[i]=i-1; } for(int j=1;j<=cnt;j++) { if(prime[j]>n/i||prime[j]>v[i])break; v[prime[j]*i]=prime[j]; phi[prime[j]*i]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]); } } } int main() { scanf("%d",&t); primes(1010); for(int i=2;i<=N;i++) s[i]=s[i-1]+phi[i]; for(int i=1;i<=t;i++) { scanf("%d",&n); printf("%d %d %d\n",i,n,2*s[n]+3); } return 0; }
“Make my parents proud,and impress the girl I like.”