Fork me on GitHub

【luoguP2158】 [SDOI2008]仪仗队

 

题目描述

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

输入格式

共一个数N

输出格式

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

输入输出样例

输入 #1
4
输出 #1
9

说明/提示

【数据规模和约定】

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

代码:

#include<cstdio>
#include<iostream>
#include<cstdlib>
#define int long long
const int N = 400010;
using namespace std;
int n,prime[N],phi[N],cnt,tot,ans;
bool vis[N];
void yilnr()
{
	vis[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!vis[i])
		{
			prime[++cnt]=i;
			phi[i]=i-1;
		}
		for(int j=1 ; j<=cnt && i*prime[j]<=n;j++)
		{
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)
			{
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			phi[i*prime[j]]=phi[i]*phi[prime[j]];
		}
	}
}
signed main()
{
	scanf("%lld",&n);
	yilnr();
	if(n==1)
	{
		cout<<"0";
		return 0;
	}
	for(int i=2;i<=n-1;i++)ans+=phi[i];
	printf("%lld\n",ans*2+3);
	return 0;
}

  

 

posted @ 2019-09-17 17:06  yelir  阅读(116)  评论(0编辑  收藏  举报