|
发表于 2021-2-9 13:42:30
|
显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2021-2-20 20:37 编辑
C++ 12ms- #include<iostream>
- #include<vector>
- #include<cstring>
- using namespace std;
- template<size_t size, typename T>
- void euler_sieve(bool (&is_prime)[size], vector<T>& primes, T (&phi)[size]) {
- T i, k;
- memset(is_prime, -1, size);
- is_prime[0] = is_prime[1] = 0;
- for (i = 2; i < size; i++) {
- if (is_prime[i]) {
- primes.push_back(i);
- phi[i] = i - 1;
- }
- for (T j : primes) {
- k = i * j;
- if (k >= size) {
- break;
- }
- is_prime[k] = false;
- if (!(i % j)) {
- phi[k] = phi[i] * j;
- break;
- }
- phi[k] = phi[i] * (j - 1);
- }
- }
- }
- int main() {
- ios::sync_with_stdio(false);
- constexpr unsigned int UPPER_BOUND = 1000000;
- static bool is_prime[UPPER_BOUND];
- static unsigned int phi[UPPER_BOUND];
- vector<unsigned int> primes;
- double max_div = 0, div;
- unsigned int max_n = 0, n;
- euler_sieve(is_prime, primes, phi);
- for (n = 2; n < UPPER_BOUND; n++) {
- div = (double)n / phi[n];
- if (div > max_div) {
- max_div = div;
- max_n = n;
- }
- }
- cout << max_n << endl;
- return 0;
- }
复制代码 |
|