CF-1333F Kate e imperfección

F. Kate y la imperfección

Supongamos que pone elementos en la colección uno por uno. Obviamente, antes de poner un elemento, no queremos tener sus múltiplos ya en la colección. Porque antes de esto, también podríamos poner este número primero, y luego poner su múltiplo en él es mejor (porque su múltiplo es más fácil de producir mayor mcd con otros números).

Entonces, al poner un elemento, todos los factores de este elemento ya deberían estar en el conjunto. Para un conjunto, si para todos los números en el conjunto, sus factores están en el conjunto, entonces el máximo de unos dos números en el conjunto mcd es el mayor factor verdadero de un cierto número (no en sí mismo).

Suponga que \ (d [x] \) es el factor verdadero máximo de x, y ordene de acuerdo con \ (d [x] \)

Si la explicación de la primera conjetura no es lo suficientemente clara, puede consultar la solución oficial del problema. En primer lugar, debe saber que la secuencia de respuestas no debe disminuir ni aumentar en segmentos. Entonces, si \ (a_i \ en A = \ {a_1, a_2, \ cdots a_k \} \) , si un factor de \ (a_i \) no está en el conjunto, puede reemplazar \ (a_i \) con este factor , La imperfección de este conjunto solo disminuirá y no aumentará, por lo que tenemos razones para hacer que todos los factores de \ (a_i \) aparezcan en este conjunto.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define dbg(x...) do { cout << "\033[32;1m" << #x <<" -> "; err(x); } while (0)
void err() { cout << "\033[39;0m" << endl; }
template<class T, class... Ts> void err(const T& arg,const Ts&... args) { cout << arg << " "; err(args...); }
const int N = 500000 + 5;
int primes[N], v[N], m;
void prime(int n){
    v[1] = 1;
    for(int i=2;i<=n;i++){
        if(!v[i]) primes[++m] = i, v[i] = 1;
        for(int j=1;j<=m;j++){
            if(primes[j] > n / i) break;
            v[primes[j]*i] = i;
            if(i % primes[j] == 0) break;
        }
    }
}

int main(){
    int n;scanf("%d", &n);
    prime(n);
    sort(v+1, v+1+n);
    for(int i=2;i<=n;i++)
        printf("%d ", v[i]);
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/1625--H/p/12687993.html
Recomendado
Clasificación