BZOJ2190: [SDOI2008]仪仗队

【传送门: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\n",phi[n]*2+3);
    return 0;
}

 

posted @ 2018-03-06 13:17  Star_Feel  阅读(140)  评论(0编辑  收藏  举报