仪仗队
仪仗队
理解
欧拉函数的应用, 欧拉函数板子题
这是题面
思路
- 考虑一个点\((x, y)\) 能不能被看到
- 如果\((x, y)\)不互质的话, 那还可以继续约分成\((x^, ,y^,)\) ,那么肯定会被这个点挡住
- 那么题意就转换成了有多少个点的横纵坐标互质
代码
#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;
}

浙公网安备 33010602011771号