HDU-2588-GCD(欧拉函数)
这道题是欧拉函数的运用。
- 什么是欧拉函数?
具体参考如下博客,博客链接:
https://blog.csdn.net/qq_44624316/article/details/105612208
先开始看到这道题我直接跑去模拟了,果然会tle。。。。
题目大意:给你两个整数n, m。让你寻找有多少个x满足gcd(x, n) >= m;其中1 <= x <= n;
怎么联想到欧拉函数上面去呢?
我们看看:
gcd(x, n) = q;
x = a * q;
n = b * q;
(q是n的因子)可以作为最大公约数。
a 和 b是互质的。我们只要找到大于等于m的q的因子,得到b,然后找小于等于b的互质的正整数,(因为x不能大于n)那么这个找互质的过程不就是我们的欧拉函数嘛?
直接用上就好啦~
最后特判一下n是完全平方数的时候,因为只能加一次。
维护ans.
代码部分:
#include <bits/stdc++.h>
using namespace std;
int t;
int n, m;
int ans;
int euler(int n)
{
int res = n;
for (int i = 2; i * i <= n; i++)
{
if (!(n % i))
{
res = res / i * (i - 1);
while (!(n % i))
{
n /= i;
}
}
}
if (n != 1)
{
res = res / n * (n - 1);
}
return res;
}
int main()
{
cin >> t;
while (t--)
{
ans = 0;
cin >> n >> m;
int i;
for (i = 1; i * i < n; i++)
{
if (!(n % i))
{
if (i >= m)
{
ans += euler(n / i);
}
if (n / i >= m)
{
ans += euler(i);
}
}
}
if (i * i == n && i >= m)
{
ans += euler(i);
}
cout << ans << endl;
}
return 0;
}