①1~n 中与 x 的gcd为d的数的个数。
https://codeforc.es/contest/1750/problem/D
1~
⌊
n
d
⌋
\left \lfloor \frac{n}{d} \right \rfloor
⌊dn⌋中与
⌊
x
d
⌋
\left \lfloor \frac{x}{d} \right \rfloor
⌊dx⌋互质的数的个数。
找出所有质因子,选奇数个+,偶数个-。
int prime[N], z;
bool v[N];
void init()
{
for (int i = 2; i < N - 5; i++)
{
if (!v[i])
prime[++z] = i;
for (int j = 1; prime[j] * i < N - 5; j++)
{
v[prime[j] * i] = 1;
if (i % prime[j] == 0)
break;
}
}
}
int cal(int x, int m, int d)
{
int ans = 0;
x /= d, m /= d;
vector<int> q;
for (int i = 1; prime[i] * prime[i] <= x; i++)
{
if (x % prime[i] == 0)
{
q.push_back(prime[i]);
while (x % prime[i] == 0)
x /= prime[i];
}
}
if (x > 1)
q.push_back(x);
int nn = q.size();
for (int i = 0; i < 1 << nn; i++)
{
int sign = 1, now = 1;
for (int k = 0; k < nn; k++)
{
if (i & (1 << k))
{
sign *= -1;
now *= q[k];
}
}
ans += sign * (m / now);
ans %= mod;
}
return ans;
}
②对于给定的整数 a,b和 d,有多少正整数对 x,y,满足 x≤a,y≤b,并且gcd(x,y)=d
https://www.acwing.com/problem/content/217/
int prime[N], z, u[N];
bool v[N];
void init()
{
u[1] = 1;
for (int i = 2; i <= N - 5; i++)
{
if (!v[i])
{
u[i] = -1;
prime[++z] = i;
}
for (int j = 1; prime[j] * i < N - 5; j++)
{
v[prime[j] * i] = 1;
if (i % prime[j] == 0)
break;
u[prime[j] * i] = u[i] * -1;
}
}
for (int i = 1; i < N - 5; i++)
{
u[i] += u[i - 1];
}
}
void solve()
{
int a, b, n, m, i, j, k, d;
scanf("%d%d%d", &a, &b, &d);
a /= d, b /= d;
n = min(a, b);
ll ans =0;
// printf("%lld\n", ans);
for (int l = 1, r; l <= n; l = r + 1)
{
r = min(n, min(a / (a / l), b / (b / l)));
ans += (u[r] - u[l - 1]) * 1ll * (a / l) * (b / l);
}
printf("%lld\n", ans);
}