BZOJ 2190: [SDOI2008]仪仗队 欧拉函数
2190: [SDOI2008]仪仗队
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 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); }