【解题报告】luoguP2158 仪仗队

【解题报告】luoguP2158 仪仗队

原题链接:https://www.luogu.com.cn/problem/P2158

思路

这道题目经过分析,我们可以发现一个结论

即对于每一个点((x,y)),如果能被看到,则一定不存在一个点((dfrac x m,dfrac y m),m, dfrac x m,dfrac y min Z,)

因为他们属于同一斜率(k= dfrac y x)

观察可以得到,因为他们没有一个 (m) 可以使上面的上面的式子成立,即(gcd(x,y)= 1)

然后直接求gcd的话肯定是不行的,然后我们继续看

实际上对于一个固定的 (x) ,我们要统计的是一个数字 (yin [1,n]) 让他们互质,所以我们要求的是x的欧拉函数

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
int n,ans;
int ola(int n)
{
	int res=n;
	for(int i=2;i*i<=n;i++)
	{
		if(n%i==0)
		{
			res-=res/i;
			while(n%i==0)
			n/=i;
		}
	}
	if(n>1)
	res-=res/n;
	return res;
}
int main()
{
	cin>>n;
	if(n==1)
	{
		cout<<0<<'
';
		return 0;
	}
	for(int i=2;i<=n-1;i++)
	ans+=ola(i);
	cout<<ans*2+3<<'
';//另一半加上少算的三个 
	return 0; 
}
本博文为wweiyi原创,若想转载请联系作者,qq:2844938982
原文地址:https://www.cnblogs.com/wweiyi2004/p/15305493.html