@ZCDHJ
2018-10-03T01:54:52.000000Z
字数 701
阅读 406
数论
题目默认的是以 为左下角,所以一个点 到左下角连线的斜率为 。已知如果两个点到起点的连线斜率相等,就会互相抵挡,所以那些能被看到的点要求在其前面的点连线的斜率没有与它的斜率相等的。那么就是要求 是一个既约分数。等于 与 互质。但是这个仪仗队的对角线以上以下是对称的,所以只要求出一半的答案,再加上那些一开始就会被看到的点数。最终答案为,注意特判一下 的情况。
#include <iostream>
#include <cstdio>
const int MAXN = 4e4;
int n, ans, tot;
int phi[MAXN | 1], prime[MAXN | 1];
bool vis[MAXN | 1];
int main() {
scanf("%d", &n);
phi[1] = 1;
for(int i = 2; i <= n; ++i) {
if(!vis[i]) {
prime[++tot] = i;
phi[i] = i - 1;
}
for(int j = 1; j <= tot && i * prime[j] <= n; ++j) {
vis[i * prime[j]] = true;
if(i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
} else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
for(int i = 2; i < n; ++i) ans += phi[i];
printf("%d\n", ans ? ans * 2 + 3 : 0);
return 0;
}