Consider the fraction, n/d, where n and d are positive integers. If nd and HCF(n,d)=1, it is called a reduced proper fraction.

If we list the set of reduced proper fractions for d  8 in ascending order of size, we get:

1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8

It can be seen that there are 21 elements in this set.

How many elements would be contained in the set of reduced proper fractions for d  1,000,000?

题目大意:

考虑分数 n/d, 其中n 和 d 是正整数。如果 nd 并且最大公约数 HCF(n,d)=1, 它被称作一个最简真分数。

如果我们将d  8的最简真分数按照大小的升序列出来,我们得到:

1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5 , 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8

可知该集合中共有21个元素。
 1,000,000的最简真分数集合中包含多少个元素?

算法一(超时):

优化技巧:

1、当分母n是素数,则以n为分母的最简真分数的数目为n-1

2、当分母和分子奇偶不同的时候,进一步检查分母和分子的最大公约数

#include<stdio.h>
#include<stdbool.h>
void swap(int* a, int* b) //交换两值的函数
{
int t;
t = *a;
*a = *b;
*b = t;
} int gcd(int a, int b) //求最大公约数函数
{
int r;
if(a < b) swap(&a, &b);
while(b) {
r = a % b;
a = b;
b = r;
}
return a;
} bool prim(int n) //判断素数函数
{
int i;
for(i = ; i * i <= n; i++) {
if(n % i == ) return false;
}
return true;
} bool fun(int a, int b) //判断两整数奇偶是否相同
{
return !((a & ) & (b & ));
} void solve()
{
int i, j, t;
long long count = ;
for(i = ; i <= ; i++) {
if(i % && prim(i)) {
count += i - ;
continue;
}
count++;
for(j = ; j < i; j++) {
if(fun(i,j) && (i % j != )) {
t = gcd(i, j);
if(t == ) count++; //如果i,j互素,符合
}
}
}
printf("%lld\n", count);
} int main()
{
solve();
return ;
}

算法二:

将1~1000000的整数分奇偶两部分计算,依然超时

#include<stdio.h>
#include<stdbool.h> #define N 1000000 int gcd(int a, int b) //求最大公约数函数
{
int r;
while(b) {
r = a % b;
a = b;
b = r;
}
return a;
} bool prim(int n) //判断素数函数
{
int i;
for(i = ; i * i <= n; i++) {
if(n % i == ) return false;
}
return true;
} bool fun(int a, int b) //判断两整数奇偶是否相同
{
return !((a & ) & (b & ));
} void solve()
{
int i, j, t;
long long count = ;
for(i = ; i <= N; i += ) {
count++;
for(j = ; j < i; j += ) {
t = gcd(i, j);
if(t == ) count++;
} }
for(i = ; i < N; i += ) {
count++;
if(prim(i)) {
count += i - ;
continue;
} else {
for(j = ; j < i; j++) {
if(gcd(i, j)) count++;
}
} }
printf("%lld\n", count);
} int main()
{
solve();
return ;
}

算法三:

#include<stdio.h>
#include<stdbool.h>
#include<math.h> #define N 1000001 bool a[N]; void Eratosthenes()
{
int i, M, j;
for(i = ; i < N; i++) {
a[i] = true;
}
M = (int)sqrt(N);
for(i = ; i <= M; i++) {
if(a[i]) {
j = i * i;
for(; j < N; j += i)
a[j] = false;
}
}
} int fun(int n)
{
int t, i, count, j;
t = n / ;
i = ;
count = n - ;
while(i <= t) {
if(a[i]) {
if(n % i == ) {
count--;
for(j = i; j * i < n; j++) {
count--;
}
}
}
i++;
}
return count;
} int main()
{
int i;
long long count = ; Eratosthenes(); for(i = ; i < N; i++) {
if(a[i]) {
count += i - ;
} else {
count += fun(i);
}
}
printf("%lld\n", count); return ;
}

算法四:使用欧拉函数

//(Problem 72)Counting fractions
// Completed on Tue, 18 Feb 2014, 14:08
// Language: C11
//
// 版权所有(C)acutus (mail: acutus@126.com)
// 博客地址:http://www.cnblogs.com/acutus/ #include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h> #define N 1000001 int phi[N]; //数组中储存每个数的欧拉数 void genPhi(int n)//求出比n小的每一个数的欧拉数(n-1的)
{
int i, j, pNum = ;
memset(phi, , sizeof(phi)) ;
phi[] = ;
for(i = ; i < n; i++)
{
if(!phi[i])
{
for(j = i; j < n; j += i)
{
if(!phi[j])
phi[j] = j;
phi[j] = phi[j] / i * (i - );
}
}
}
} void solve()
{
int i;
long long ans =;
for(i = ; i < N; i++) {
ans += phi[i];
}
printf("%lld\n", ans);
} int main()
{
genPhi(N);
solve();
return ;
}
Answer:
303963552391

(Problem 72)Counting fractions的更多相关文章

  1. (Problem 73)Counting fractions in a range

    Consider the fraction, n/d, where n and d are positive integers. If nd and HCF(n,d)=1, it is called ...

  2. (Problem 33)Digit canceling fractions

    The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplif ...

  3. (Problem 57)Square root convergents

    It is possible to show that the square root of two can be expressed as an infinite continued fractio ...

  4. (Problem 42)Coded triangle numbers

    The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangl ...

  5. (Problem 41)Pandigital prime

    We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly o ...

  6. (Problem 70)Totient permutation

    Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number ...

  7. (Problem 74)Digit factorial chains

    The number 145 is well known for the property that the sum of the factorial of its digits is equal t ...

  8. (Problem 46)Goldbach's other conjecture

    It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a ...

  9. (Problem 53)Combinatoric selections

    There are exactly ten ways of selecting three from five, 12345: 123, 124, 125, 134, 135, 145, 234, 2 ...

随机推荐

  1. Pig Latin儿童黑话(java)

     ●假设单词以辅音字母開始,将词首的辅音字母字符串(第一个元音字母前的全部字母)从单词的开头移动到末尾,然后加上后缀ay,这样就形成了它的pig  latin. ●假设单词以元音字母開始,仅仅须要 ...

  2. 君子性非异也,善假于物也 - Threejs 引入TrackballControls 查看场景

    君子性非异也,善假于物也 - Threejs 引入TrackballControls 查看场景 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循" ...

  3. ZOJ 1563 Pearls(动态规划)

    /* 分析: 因为他给的数据是递增的 而求得是这些数据总的 最优解 所以我们可以考虑,它的子问题求解不影响总的求解 也就是我们可以先求出 第一个的最优解 第二个....以此类推到总的最优解 那么我们想 ...

  4. 学会用这二个键,你就是电脑高手了,一个是Win键,另一个是Ctrl!

    学会用这二个键,你就是电脑高手了,一个是windows键,另一个是Ctrl键. 一.windows键 1. 很多时候,需要离开座位去做别的事情,如果对自己的电脑安全很重视,不妨按住windows键后, ...

  5. Method Swizzle黑魔法,修改 ios 系统类库方法 SEL IMP

    Method Swizzle黑魔法,修改 ios 系统类库方法   版权声明:本文为博主原创文章,未经博主允许不得转载. 一般来说,系统提供的方法已经足够开发了,但是有的时候有些需求用普通方法不好做. ...

  6. IOS--当字符串返回的数据格式为xml/html时

    今天一来办公室就接到客户返回的BUG,其中一个是因为后台返回的字符串中的数据为xml/html格式.  后来经过百度,发现了两种解决方法,第一种是使用webView,webView中专门为了这种情况准 ...

  7. JavaSE复习日记 : 继承关系和super关键字以及继承关系中方法的覆写

    /* * 类的继承和super关键字 * * 软件开发的三大目的: * 可拓展性; * 可维护性; * 可重用性; * * 这里单说下可重用性这一项: * 为了代码复用,复用方式有: * 函数的调用复 ...

  8. BZOJ 2946: [Poi2000]公共串( 后缀自动机 )

    一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...

  9. 初来乍到--------smarty

    Smarty Day01-----smarty的使用 作用:把php+html分离,程序和美工 使用: 1.下载源码包 2.目录结构 libs 源码文件 Smarty.class.php templa ...

  10. eclipse注解快捷键

    Search 功能:全局文件内容搜索快捷键: Ctrl + H -------------------------------------------------------------------- ...