标签:
题目链接:
http://poj.org/problem?id=2478
题目大意:
在一个集合f(n)中,包涵一些分数a/b,这些分数满足:
1:不可约分。
2:0 < a < b <= n and gcd(a,b) = 1。已知n,问f(n)里面有多少个元素?
解题思路:
如果把a,b分别当成横纵坐标,可以画出一个n*n的矩阵,因为0 < a < b <= n ,所以只有矩阵主对角线上方的点组成的分数有可能满足要求(不包含主对角线),因此可以推得f(n) = f(n-1)+[1,n]区间内与n的最大公约数为1的数的个数。
代码:
1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 #define maxn 1000010 9 long long b[maxn], a[maxn];//因为数据范围太大,int会超限 10 void prime () 11 { 12 int i, j, k = 0; 13 for (i=0; i<maxn; i++) 14 a[i] = i, b[i] = 0; 15 for (i=2; i<maxn; i++) 16 if (b[i] == 0) 17 { 18 for (j=i; j<maxn; j+=i) 19 b[j] = 1, a[j] = a[j] / i * (i-1);//利用欧拉函数求少于或等于n的数中与n互质的数的数目 20 } 21 } 22 23 24 int main () 25 { 26 int n, i; 27 prime(); 28 for (i=3; i<maxn; i++) 29 a[i] += a[i-1]; 30 while (scanf ("%d", &n), n) 31 printf ("%lld\n", a[n]); 32 33 return 0; 34 }
标签:
原文地址:http://www.cnblogs.com/alihenaixiao/p/4451438.html