题目描述

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

输入输出格式

输入格式:

 

共一个数N

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 
4
输出样例#1: 
9

说明

【数据规模和约定】

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

这道题其实挺水的,就是求一下互质的点的个数。n开到40000,所以n方肯定不行,现行算一下互质的个数就可以了。

代码如下:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long ll;
 6 ll read() {
 7     ll a = 0,b = 1;
 8     char c = getchar();
 9     while(c < '0' or c > '9') {
10         if(c == '-') b = -1;
11         c = getchar();
12     }
13     while(c >= '0' and c <= '9') {
14         a = a * 10 + c - '0';
15         c = getchar();
16     }
17     return a * b;
18 }
19 ll n,ans = 0,e[40010];
20 ll gcd(ll a,ll b) {
21     if(b > a) swap(a,b);
22     if(b == 0) return a;
23     return gcd(b,a % b);
24 }
25 int main() {
26     n = read();
27     ans = 2;
28     if(n==1) {
29         printf("0");
30         return 0;
31     }
32     for(int i=1; i<=n; ++i)e[i]=i;
33     for(int i=2; i<=n; ++i) {
34         if(e[i]==i) {
35             for(int j=i; j<=n; j+=i) {
36                 e[j]=e[j]/i*(i-1);
37             }
38         }
39     }
40     --n;
41     for(int i=2; i<=n; ++i) {
42         ans+=e[i]*2;
43     }
44     printf("%lld",ans+1);
45     return 0;
46 }