洛谷 2158 [SDOI2008]仪仗队

Description

作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。

Input

共一个数N

 Output

共一个数,即C君应看到的学生人数。

Sample

输入样例#1:
4
输出样例#1:
9

Hints

【数据规模和约定】

对于 100% 的数据,1 ≤ N ≤ 40000

 

Solution

假设某一个小朋友与C君横向相距i条边,竖向相距j条边,那么i,j互质时,可以被C君看到

某个方向相距0条边单独计算,分别相距1条边单独计算

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int o[40011],phi[40044],pri[40044];         //少看一个0 
void getphi(int n)
{
	int p=0;
	o[1]=0;phi[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!o[i])
		  pri[++p]=i,phi[i]=i-1;
		for(int j=1;j<=p&&pri[j]*i<=n;j++)
		{
			o[pri[j]*i]=1;
			if(i%pri[j]==0)
			{
				phi[i*pri[j]]=phi[i]*pri[j];
				break;	
			}
			else
			  phi[i*pri[j]]=phi[i]*(pri[j]-1);
		}
	}
}
int main()
{
	int n;
	scanf("%d",&n);
	getphi(n-1);
	for(int i=2;i<=n-1;i++)
	  phi[i]+=phi[i-1];
	printf("%d",phi[n-1]*2+1);
	return 0;
}
posted @ 2017-10-17 21:11  o00v00o  阅读(101)  评论(0编辑  收藏  举报