思路:
我们将其所在的位置设为(0,0),那么如果存在一个点(x,y),且有gcd(x,y)=k(k!=1),那么点(x/k,y/k)一定会将(x,y)挡住。而如果k=1,那么点(x,y)就一定会被看到。 这样就会想到这不是欧几里得吗??怎么跟欧拉函数扯上关系了???
某位大佬跟我说你用欧几里得吧,把你T成狗。。。。。
好吧,我们就看一下正解吧。。。。。我们把这个题的式子列出来
n n n i
∑ ∑ [gcd(i,j) = 1] + 2 将以上式子拆成两半等于 2(∑∑ [gcd(i,j)=1]))+1 我们又可以知道 φ(i) =∑ j=1 [gcd(i,j) = 1] 所以就真的变成了裸地
i=1 j=1 i=1 j=1
欧拉函数了。
代码:
#include#include #include #include #include using namespace std;int n,ans,ans1;int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f;}int get_phi(int x){ int sum=x; if(x%2==0) { while(x%2==0) x/=2; sum/=2; } for(int i=3;i*i<=x;i+=2) { if(x%i==0) { while(x%i==0) x/=i; sum=sum/i*(i-1); } } if(x>1) sum=sum/x*(x-1); return sum;}int main(){ n=read();ans1=1; //枚举到n-1,因为我们把图劈成了两半,如果枚举到n的话, 对角线上的人数就加了两遍,所以我们不枚举到他,最后直接加1就好了 for(int i=2;i