[001]Multiples of 3 and 5
题意
找寻[1,1000)以内,是3的倍数,或是5的倍数的数。
思路
暴力搜索判定
优化
容斥,先计算3的倍数在1000内有多少个,然后用等差公式计算出1000内3的倍数的和,同理有5的倍数,两者相加,重复的数用15的倍数的和减去即可。
代码
C++\STL1
2
3
4
5
6
7
8
9
10
11
12long long SumOf(long long up, int k)
{
long long cnt = (up - 1) / k;
return (k + cnt * k) * cnt / 2;
}
int main()
{
long long n;
cin >> n;
cout << SumOf(n, 5) + SumOf(n, 7) - SumOf(n, 35) << endl;
return 0;
}
答案
233168
[002]Even Fibonacci numbers
题意
斐波那契数列:
1 | F[1] = 1 |
求斐波那契数列中数字为偶数的所有数字之和,数字不大于400万。
思路
递推暴力
C++\STL
1 | int main() |
优化
列表找规律:
1 | F[1] = 1 F[2] = 1 |
符合题意的有
1 | F[3] = 2 |
观察可得 F[n] = 4 * F[n-3] + F[n - 6]
正确性可以由斐波那契数列定义推出:
$$
\begin{align}
F_n &= F_{n-1} + F_{n-2} \\
& = F_{n-2} + F_{n-3} + F_{n-2} = 2 \times F_{n-2} + F_{n-3} \\
& = 2 \times ( F_{n-3} + F_{n-4} ) + F_{n-3} ) = 3 \times F_{n-3} + 2 \times F_{n-4} \\
& = 3 \times F_{n-3} + F_{n-4} + F_{n-5} + F_{n-6} \\
& = 4 \times F_{n-3} + F_{n-6} \\
\end{align}
$$
代码
C++\STL
1 | int main() |
答案
4613732
[003]Largest prime factor
题意
求 600851475143 最大的质因子
思路
刚开始先暴力的,发现循环判定再循环判定复杂度就太高了。于是用埃氏筛法扫过去就行了。
代码
C++\STL
1 | int Eratosthenes() |
答案
6857
[004]Largest palindrome product
题意
对于一个回文数,如:9009 = 91 × 99,他是由两个两位数构成的。现在找两个三位数能构成的最大回文数。
思路
首先是构造回文数,它符合一下几个规律:
- 六位数
- 六位数里面最大的
- 前三位和后三位对应相同
由上,我们将回文数按位拆分,枚举前一二三位,做对应就行了。值得一提的是第一位不可能为0,二三位都有可能为0。
优化
回文数必然可以被11整除,证明如下: 回文数的形式必然为:
100000a + 10000b + 1000c + 100c + 10b + a
=100001a + 10010b + 1100c
因为:
100001 % 11 = 0
10010 % 11 = 0
1100 % 11 = 0
所以:
回文数必然可以被11整除
代码
C++\STL
1 | int main() |
答案
906609
[005]Smallest multiple
题意
2520是最小的能被1-10中每个数字整除的正整数。 最小的能被1-20中每个数整除的正整数是多少?
思路
刚开始想直接找到20以内的质数2,3,5,7…相乘得出答案的,后来交了发现不对,尝试了一次,发现在4的时候就不能整除了。后来百度搜了一下,要:
- 列出20以内的质数,并求这些质数的小于20的最高次幂
- 再将这些质数的最高次幂的积相乘
于是有了下面的代码。
代码
C++\STL
1 | bool check(vector<int>& s, int num) |
答案
232792560