Title

仪仗队

仪仗队

理解

欧拉函数的应用, 欧拉函数板子题
这是题面

思路

  1. 考虑一个点\((x, y)\) 能不能被看到
  2. 如果\((x, y)\)不互质的话, 那还可以继续约分成\((x^, ,y^,)\) ,那么肯定会被这个点挡住
  3. 那么题意就转换成了有多少个点的横纵坐标互质

代码

#include <bits/stdc++.h>
#define endl '\n';
#define int long long
using ld = long double;
using lli = long long;
using ull = unsigned long long;
const int maxn = 40010;
int cnt = 0;
bool vis[maxn];
int prime[maxn];
int ans[maxn];
int N = 0;

void phi()
{
    ans[1] = 1;
    for (int i = 2; i <= N; i++)
    {
        if (!vis[i])
        {
            prime[++cnt] = i;
            ans[i] = i - 1;
        }
        for (int j = 1; j <= cnt && i * prime[j] <= N; j++)
        {
            vis[i * prime[j]] = 1;
            if (i % prime[j] == 0)
            {
                ans[i * prime[j]] = ans[i] * prime[j];
                break;
            }
            ans[i * prime[j]] = ans[i] * (prime[j] - 1); 
        }
    }
}


void solve()
{
    std::cin >> N;
    if (N == 1)
    {
        std::cout << 0 << endl;
        return;
    }
    N--;
    phi();
    long long res = 0;
    for (int i = 1; i <= N; i++)
    {
        res += ans[i];
    }
    res *= 2;
    res += 1;
    std::cout << res << endl;
}   

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t = 1;
    //std::cin >> t;
    while(t--)
    {
        solve();
    }
    return 0;
}
posted @ 2024-09-26 21:57  栗悟饭与龟功気波  阅读(14)  评论(0)    收藏  举报