HYSBZ 仪仗队 2190 (容斥原理)

2190: [SDOI2008]仪仗队

Time Limit: 10 Sec   Memory Limit: 259 MB
Submit: 2192   Solved: 1389
[ Submit][ Status][ Discuss]

Description

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

Input

  共一个数N。

Output

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

Sample Input

  4

Sample Output

  9


HINT

【数据规模和约定】   对于 100% 的数据,1 ≤ N ≤ 40000

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define INF 0x3f3f3f3f
#define ull unsingned long long
#define ll long long
#define IN __int64
#define N 10010
#define M 1000000007
using namespace std;
int p[N];
int q[N];
int k;
int getp(int n)
{
	int i,j;
	k=0;
	for(i=2;i*i<=n;i++)
	{
		if(n%i==0)
		{
			p[k++]=i;
			while(n%i==0)
				n/=i;
		}
	}
	if(n>1)
		p[k++]=n;
}
int solve(int n)
{
	int i,j,kk,t=0,sum=0;
	q[t++]=-1;
	for(i=0;i<k;i++)
	{
		kk=t;
		for(j=0;j<kk;j++)
			q[t++]=p[i]*q[j]*(-1);
	}
	for(i=1;i<t;i++)
		sum+=n/q[i];
	return sum;
}
int main()
{
	int i,j,k;
	int n,m;
	while(scanf("%d",&n)!=EOF)
	{
		n--;
		int cnt=n;
		for(i=2;i<=n;i++)
		{
			getp(i);
			cnt+=n-solve(n);
		}
		printf("%d\n",cnt+2);
	}
	return 0;
}


你可能感兴趣的:(HYSBZ 仪仗队 2190 (容斥原理))