# 欧拉计划 ## 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) ```rust 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算法即可