欧拉计划

0号问题

题目

如果一个数是某个正整数的平方,那么这个数就是完全平方数,或者简称平方数。 例如: 25 是一个平方数,因为 \(5^2 = 25\) 它也是一个奇数平方数。

前五个平方数是:[1,4,9,16,25]奇数平方数之和为 1 + 9 + 25 = 35 。

在前172000 个平方数中,所有奇数平方数的总和是多少?

题解

实际上就是计算

\[ 1^2 + 3^2 + 5^2 + .. + 171999^2 \]

其实这是一个等幂求和的问题,曾经我们学过:

\[ 1^2 + 2^2 + .. + n^2 = \frac{n (n+1) (2n+1)} \]

我们可以观察一下偶数的

\[ 2^2 + 4^2 + 6^2 + .. + n^2 = 4 (1^2 + 2^2 + 3^2 + ... + (\frac{n}{2})^2) = \frac{4 n (n+1) (2n+1)}{6} \]

我们减一下得到

\[ 1^2 + 3^2 + .. + (n-1)^2 = \frac{n (n-1) (n+2)}{6} \]

1号问题

题目

斐波那契数列中每一项都是由前两项相加得到的。从 1 和 2 开始,前 10 项将是:1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …和第一个条款如下: 1,2,3,5,8,13

考虑斐波那契数列中值不超过四百万的项,求偶数项之和。

题解

这个题枚举即可 主要是需要快速计算斐波那契数列的算法: 要么用比内公式O(1) 要么用矩阵快速幂O(logn)

fn main() {
    let mut sum = 0;
    let mut n = 0;
    loop {
        let fib_num = fib(n);
        if fib_num > 4_000_000 {
            break;
        }
        if fib_num % 2 == 0 {
            sum += fib_num;
        }
        n += 1;
    }
    println!("{}", sum);
}

pub fn fib(n: i32) -> i32 {
    if n <= 1 { return n;}

    let mut base = [[1,1],[1,0]];
    let mut pow = n -1;
    let mut result =  [[1, 0], [0, 1]];
    while pow > 0 {
        if pow &1 == 1 {
            result = mul(&result,&base);
        }
        base = mul(&base,&base);
        pow >>= 1;
    }
    result[0][0]
}

fn mul(a: &[[i32; 2]; 2], b: &[[i32; 2]; 2]) -> [[i32; 2]; 2] {
    [
        [a[0][0] * b[0][0] + a[0][1] * b[1][0],
         a[0][0] * b[0][1] + a[0][1] * b[1][1]],
        [a[1][0] * b[0][0] + a[1][1] * b[1][0],
         a[1][0] * b[0][1] + a[1][1] * b[1][1]],
    ]
}

3号问题

The prime factors of 13195 are 5,7,13 and 29.

What is the largest prime factor of the number 600851475143 ?

题解

这本质上就是个质因数分解 用试除法或者Pollard Rho算法即可