以左下角为坐标原点,→为x正方向,↑为y正方向建议直角坐标系,而能看见多少人即为这条直线的斜率第一次出现(在这条斜率的直线上的后面的人被第一次出现的人挡住了)。而分数化最简形式有gcd(x,y)= 1;即求矩阵中有多少互质的x和y。(1,1; 1,2; 2,2; 1,3; 2,3; 3,3)这些坐标点来求多少互质的x和y?枚举发现跟欧拉函数有点像?
欧拉函数:1-n中与n互质的数的个数即为欧拉函数的值。
我们发现就是求1到n-1的欧拉函数的和ans(此时为一半,坐标系关于y=x对称,加上y=x本身,所以答案为2*ans+1)。(0,0)为起点,所以是到n-1
欧拉函数
int euler(int n) {
int ans = n;
for(int i = 2; i * i <= n; i++) {
if(n % i == 0) {
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
那么求和?
#include<bits/stdc++.h>
using namespace std;
#define int long long
int eular(int n) {
int ans = n;
for(int i = 2; i * i <= n; i++) {
if(n % i == 0) {
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
signed main() {
int n;
cin >> n;
if(n == 1) {
cout << 0;
return 0;
}
int ans = 0;
for(int i = 1; i <= n - 1; i++) ans += eular(i);
cout << ans * 2 + 1;
return 0;
}