题目描述
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。
输入输出格式
输入格式:
共一个数N
输出格式:
共一个数,即C君应看到的学生人数。
输入输出样例
输入样例#1: 复制
4
输出样例#1: 复制
9
说明
【数据规模和约定】
对于 100% 的数据,1 ≤ N ≤ 40000
这个题目很容易看出来是求斜率的个数,即为求小于n的互质的数的个数,垂直和竖直的可以分开考虑,最后的结果即为
res=2*phi(n)+3 n>=2时
n=0 n=1时,
其中phi是欧拉函数的值
欧拉函数的求法可以参考这篇博客https://www.cnblogs.com/Roni-i/p/8588825.html
#include<iostream>
#include<vector>
#include<climits>
#include<queue>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int phi(int n)
{
int tmp = n;
if (n == 1)
return 1;
for (int i = 2; i*i <= n; i++)
{
if (n%i == 0)
{
tmp = tmp * (i - 1) / i;
while (n%i == 0)
n /= i;
}
}
if (n > 1)//本身是质数的情况下phi(n)=n-1;
tmp = tmp * (n - 1) / n;
return tmp;
}
int main()
{
int n;
cin >> n;
if (n == 1)
cout << "0" << endl;
else
{
int res = 0;
for (int i = 2; i <= n - 1; i++)
res += phi(i);
cout << 2*res+3;
}
return 0;
}