Teoría Problema número real cf 628 E. de Ehab

El significado de los problemas

Dada la secuencia.
El número de no más de 7 Divisor
la búsqueda de una secuencia mínima tal que el producto es un cuadrado perfecto

solución del problema

No más de 7 divisor equivalente a un máximo de dos factores primos.
Y sólo nos importa la potencia impar de factores primos.
Así que quitar todos los elementos cuadrado, dejando un poder extraño.
Mientras que este número es extraño poder de dos, que es un término al cuadrado.

Consideramos, por varias incorporado un borde, el borde de incluso dos factores primos.
Si es un número primo, 1, e incluso a sí mismos.

No se no se requiere un número primo, porque la respuesta no contribuye a
tales 10 = 2 5 10 = 2 * 5 , si la conexión 1 y 10, por ejemplo, que con el fin de tener dos 10 2 10 * 2 , entonces también debe ser un factor cualitativo 2 2 y 5 5 .
Por lo tanto directamente 2 2 y 5 5 puede ser.

Encontrar el anillo más pequeño, por lo que para todos los factores primos de los dos números anteriores tienen tienen, entonces eso es aún el poder.

Encuentra los anillos más pequeños b f s BFS , para enumerar los puntos b f s BFS , porque no se sabe en qué momento en el anillo más pequeño.
Sin embargo, para asegurarse de que siempre hay un punto inferior al anillo más pequeño 1 e 3 1E3 , de lo contrario no es el número de > 1 e 6 > 1E6 a.
Enumerar 1 e 3 1E3 de b f s BFS .

b f s BFS parte de determinación es para grabar desde este borde al siguiente punto si no visitados, y el punto más próximo se ha visitado, por lo que el anillo.
Llevado a cabo en la etiqueta lateral v i s vis registro puede, por lo que es igual a la fuente de corriente continua, de modo de evitar la complejidad vaciado.

#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
using namespace std;

const int maxn = 1e6+50;

typedef long long ll;

int cnt=0;
vector<pair<int,int> >G[maxn];
int vis[maxn],len[maxn],ans=0x3f3f3f3f;

void bfs(int i){
    queue<int>q;
    q.push(i);
    memset(len,0x3f,sizeof(len));
    len[i]=0;
    while(!q.empty()){
        int u=q.front();q.pop();
//        cout<<u<<":"<<" ";
        for(auto it:G[u]){
            int v=it.first,id=it.second;
            if(vis[id]==i)continue;
//            cout<<v<<" ";
            vis[id]=i;
            if(len[v]!=0x3f3f3f3f)ans=min(ans,len[u]+len[v]+1);
            else len[v]=len[u]+1,q.push(v);
        }
//        puts("");
    }
}

int main(){
    int n,x;cin>>n;
    FOR(i,1,n){
        scanf("%d",&x);
        for(int j=2;j<=sqrt(x);j++){
            while(x%(j*j)==0)x/=j*j;
        }
        if(x==1){
            puts("1");
            return 0;
        }
        vector<int>tmp;
        for(int j=2;j<=sqrt(x);j++){
            if(x%j==0){
                tmp.push_back(j);
                while(x%j==0)x/=j;
            }
        }
        if(x!=1)tmp.push_back(x);
        if(tmp.size()==1){
            G[1].push_back(make_pair(x,++cnt));
            G[x].push_back(make_pair(1,cnt));
        }
        else{
            G[tmp[0]].push_back(make_pair(tmp[1],++cnt));
            G[tmp[1]].push_back(make_pair(tmp[0],cnt));
        }
    }
    FOR(i,1,sqrt(maxn-1))bfs(i);
    if(ans==0x3f3f3f3f)puts("-1");
    else cout<<ans<<endl;
}

De hecho, esta cuestión empecé a ver que el problema no será la solución, pero muchas personas utilizan Internet para construir divisor lado, creo que la constante de poco grande, con un factor primo, entonces menos capaz 7 7 cantos de plegado. Por último, ejecute 1300 m s 1300ms .

Aquí Insertar imagen Descripción

Publicados 203 artículos originales · ganado elogios 17 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/mxYlulu/article/details/104964928
Recomendado
Clasificación