BZOJ 2190: [SDOI2008]仪仗队 欧拉函数

2190: [SDOI2008]仪仗队

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 1405  Solved: 901

题目连接

http://www.lydsy.com/JudgeOnline/problem.php?id=2190

Description

 作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。      现在,C君希望你告诉他队伍整齐时能看到的学生人数。

 

Input

共一个数N。

Output

共一个数,即C君应看到的学生人数。

Sample Input

4

Sample Output

9

HINT

 对于 100% 的数据,1 ≤ N ≤ 40000

题解:

这道题转化一下,就是求0<=x,y<n中,gcd(x,y)=1的个数

这时候我们就得祭上欧拉函数了!

搞呀搞,就很简单的知道,答案应该是前n-1项欧拉函数和-1+2(有0的存在)

代码:

 

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
typedef long long LL;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200001
#define mod 10007
#define eps 1e-9
const int inf=0x7fffffff;   //无限大
/*

*/
//**************************************************************************************
inline 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;
}
LL phi[maxn],n;
void phi1()
{
    memset(phi,0,sizeof(phi));
    phi[1]=1;
    for(LL i=2;i<=n;i++)
    {
        if(!phi[i])
        {
            for(LL j=i;j<=n;j+=i)
            {
                if(!phi[j]) phi[j]=j;
                phi[j]=phi[j]/i*(i-1);
            }
        }
    }
}
int main()
{
    n=read();
    phi1();
    LL ans=0;
    for(int i=1;i<n;i++)
        ans+=phi[i];
    printf("%d",ans*2+1);
}

 

posted @ 2015-03-25 15:16  qscqesze  阅读(239)  评论(0编辑  收藏  举报