洛谷 2158 [SDOI2008]仪仗队
Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N
Output
共一个数,即C君应看到的学生人数。
Sample
输入样例#1:
4
输出样例#1:
9
Hints
【数据规模和约定】
对于 100% 的数据,1 ≤ N ≤ 40000
Solution
假设某一个小朋友与C君横向相距i条边,竖向相距j条边,那么i,j互质时,可以被C君看到
某个方向相距0条边单独计算,分别相距1条边单独计算
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstdio> using namespace std; int o[40011],phi[40044],pri[40044]; //少看一个0 void getphi(int n) { int p=0; o[1]=0;phi[1]=1; for(int i=2;i<=n;i++) { if(!o[i]) pri[++p]=i,phi[i]=i-1; for(int j=1;j<=p&&pri[j]*i<=n;j++) { o[pri[j]*i]=1; if(i%pri[j]==0) { phi[i*pri[j]]=phi[i]*pri[j]; break; } else phi[i*pri[j]]=phi[i]*(pri[j]-1); } } } int main() { int n; scanf("%d",&n); getphi(n-1); for(int i=2;i<=n-1;i++) phi[i]+=phi[i-1]; printf("%d",phi[n-1]*2+1); return 0; }