题目描述
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。
现在,C君希望你告诉他队伍整齐时能看到的学生人数。
输入输出格式
输入格式:
共一个数N
输出格式:
共一个数,即C君应看到的学生人数。
输入输出样例
说明
【数据规模和约定】
对于 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 }