【传送门:BZOJ2190】
简要题意:
给出一个有n*n个点的图,求出从左下角的点能够无障碍连接的点数
题解:
就稍微想了一下下
首先无障碍说明构成的直线上没有其他点,同时也说明当前被连接的点的纵距离/横距离为最简分数(可以用什么相似三角形之类的证明一下啦)
然后这道题就转化成求1到n-1中不同的互质数对,因为n*n的图最长距离为n-1
就用欧拉来求
然后要把得出来的值*2+3,因为图有对称性,所以要*2,因为最下角的三条边也要加上,而欧拉的时候是得不到这三个的
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int phi[41000]; int n; void oula() { for(int i=2;i<=n;i++) phi[i]=i; for(int i=2;i<=n;i++) { if(phi[i]==i) for(int j=i;j<=n;j+=i) phi[j]-=phi[j]/i; phi[i]+=phi[i-1]; } } int main() { scanf("%d",&n); n--; oula(); printf("%d ",phi[n]*2+3); return 0; }