题目大意:给定一个集合F(n), F(n)中的集合元素为 满足 gcd(a, b) == 1 && 0 < a < b < = n 的分数 a/b; 现在问F(n) 中有多少个元素;
题目分析:尝试枚举分母b, 根据要求 0 < a < b, 所以b应该从2开始;
for(int b = 2; b <= n; ++b); 这是这个集合中所有的分母条件, 对于枚举的每个b , 我们只需要寻找有多少个a 满足 a < b 且 a 和 b 互质就可以了, 及为求每个b的欧拉函数 euler(b)的值;
那么这个题就很好解决了, 先通过筛选法打出每个数对应的欧拉值; 接着; for(int b= 2; b <= n; ++b) ans += euler[i]; 求和计算答案就可以了;
ac代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e6+10;
int euler[maxn];
void init(){
//筛选法打欧拉函数表;
for(int i = 1; i < maxn; ++i) euler[i] = i;
for(int i = 2; i < maxn; ++i){
if(euler[i] == i){
for(int j = i; j < maxn; j+=i){
euler[j] = euler[j]/i*(i-1);
}
}
}
}
int main()
{
init();
int n;
while(~scanf("%d", &n) && n){
long long ans = 0;
for(int i = 2; i <= n; ++i) ans+=euler[i];
printf("%I64d\n", ans);
}
}