欧拉函数
定义baidu
bzoj2190
首先我们可以发现横坐标和纵坐标必须互质,否则会有个和他相似的小三角形挡住他
然后就不知所措了,脑补了奇怪的做法,然后发现只要欧拉函数乘一乘就可以了
p[i]:i的欧拉函数 ans=2*p[1-(n-1)]的和+1
但是我不知道怎么快速地求出欧拉函数。。。
结果发现竟然有一些奇怪的性质,代码里有。。。
#include<cstdio> #include<cstring> #define N 40010 using namespace std; int n,tot; int p[N],prime[N],mark[N]; int main() { scanf("%d",&n); if(n==1) { printf("0"); return 0; } if(n==2) { printf("3"); return 0; } p[1]=1; for(int i=2;i<n;i++) { if(!mark[i]) { prime[++tot]=i; p[i]=i-1; } for(int j=1;j<=tot&&prime[j]*i<=n;j++) { mark[prime[j]*i]=1; if(i%prime[j]==0) p[i*prime[j]]=p[i]*prime[j]; else p[i*prime[j]]=p[i]*(prime[j]-1); } } int ans=0; for(int i=1;i<n;i++) { ans+=p[i]; } printf("%d",2*ans+1); return 0; }