原题链接:201. 可见的点 - AcWing题库

题意:从原点可以直接到达(不经过其他点)的点为可见点,给定(x,y)的范围N,求一共有多少可见点

思路

可见点不能经过其他点

即二者不能有公因子,即互质

假设一个点(y)固定,那么另一个点的取值的个数就是从0到y的与y互质的数的个数

欧拉函数

实现

#include <iostream>
#include <algorithm>
#include <cstring>
 
using namespace std;
typedef long long LL;
 
const int N = 1e4 + 10;
 
LL p[N];
int n;
 
int get_euler(int n)
{
    LL ans = n;
    for(int i = 2; i <= n / i; 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;
}
 
int main()
{
    cin >> n;
    for(int i = 1; i <= 1000; i ++)
    {
        p[i] = get_euler(i);
        p[i] += p[i-1];
    }
    //cout << p[1] << endl;
    for(int i = 1; i <= n; i ++)
    {
        int N;
        cin >> N;
        cout << i << ' ' << N << ' ' << 2 * p[N] + 1 << endl;
    }
    
    return 0;
}