VERDADERO Teoría de Números problema de CodeForces1325 E. Ehab (convertido a los problemas del ciclo mínimos requeridos + BFS anillo más pequeño)

Significado de las preguntas:

Para una longitud n matriz a, los elementos de la matriz satisfacen la condición: Cada número sólo un máximo de siete factores
ahora quiero que elige un período de sub-secuencias, secuencias que satisface producto es un cuadrado perfecto, la longitud mínima de la secuencia que se pide la cantidad de , la longitud mínima de salida, no hay salidas de solución -1
rango de datos: n <= 1e5, a ( i) <= 1E6

ideas:

cuadrado perfecto que sea potencia de los factores primos del número son aún.

Sólo un número máximo de siete factores, puede tener un máximo de sólo dos factores primos, debido a que el número tres factor de germoplasma de al menos ocho factores.

Si un número no es potencias impares de los factores primos, entonces es un cuadrado perfecto, se puede dar salida a 1
si un número impar tiene una potencia de factores primos, por lo que el factor de calidad y el punto 1 aristas no dirigidas, incluso
si un hay una serie de dos de las potencias impares de los factores primos, por lo que los bordes entre los dos factores primos, incluso sin dirección

Los gráficos anillo más pequeño es la respuesta.

Calcular el anillo mínimo común es Floyd, pero la complejidad es demasiado alto, esto claramente no es cuestión.

Teniendo en cuenta el lado derecho es 1, es posible enumerar todos los puntos como punto de partida para calcular los + BFS anillo mínimo.
Sino como un punto de partida para enumerar todos los puntos será el tiempo de espera.
Teniendo en cuenta el máximo rango de datos, ya que el rango de la 1e6 de datos máxima, 1E6 es mayor que la raíz (es decir, mayor que el 1E3 punto), y la misma no puede ser puntos contiguos mayor que 1E3 (imposible debido a que un número mayor de dos de 1E3 cualitativa los factores), y sólo podrán ser conectado punto es menos de 1E3, requiriendo así solamente enumerate menos 1E3 punto como un punto de inicio en la línea.

PD:
BFS buscan anillo más pequeño es la primera vez que lo vio, en realidad no entiende el principio.
Videos figura BFS poco jerárquica de una búsqueda para encontrar que cuando x de V se ha encontrado con el tiempo, el anillo debe ser la mínima d (x) + d (v ) + 1-d (LCA (x, v)), pero estamos directamente código d (x) + d (v ) 1 toma min, ningún tubo detrás de la LCA, encontrado poca atención por un momento porque el número del nodo raíz para enumerar todo, siempre a su enumeración LCA como la raíz, este tiempo puede ser la fórmula anterior se puede quitar más tarde en un LCA, que es conseguir el acceso directo a la respuesta correcta siempre min.

Para esta pregunta, que no enumera también sea mayor que para 1E3, ya que está conectado a enumerar los puntos como LCA puede calcular la respuesta.

código:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e6+5;
int head[maxm],nt[maxm<<1],to[maxm<<1],w[maxm<<1],cnt,idx;
int d[maxm],mark[maxm];
int ans=1e9;
int n;
void add(int x,int y,int z){
    cnt++;nt[cnt]=head[x];head[x]=cnt;to[cnt]=y,w[cnt]=z;
}
bool isprime(int x){
    for(int i=2;i*i<=x;i++){
        if(x%i==0)return 0;
    }
    return 1;
}
void bfs(int st){
    queue<int>q;
    q.push(st);
    memset(d,-1,sizeof d);
    for(int i=1;i<=idx;i++)mark[i]=0;//清空边标记
    d[st]=0;
    while(!q.empty()){
        int x=q.front();
        q.pop();
        for(int i=head[x];i;i=nt[i]){
            if(mark[w[i]])continue;//回边跳过
            mark[w[i]]=1;
            int v=to[i];
            if(d[v]==-1){
                d[v]=d[x]+1;
                q.push(v);
            }else{
                ans=min(ans,d[v]+d[x]+1);
            }
        }
    }
}
signed main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%lld",&x);
        int a=0,b=1;
        for(int j=2;j*j<=x;j++){
            if(x%j==0){
                int cnt=0;
                while(x%j==0){
                    cnt++;
                    x/=j;
                }
                if(cnt%2){
                    if(!a)a=j;
                    else b=j;
                }
            }
        }
        if(x!=1){
            if(!a)a=x;
            else b=x;
        }
        if(!a){//如果本身就是完全平方数,则答案为1
            puts("1");
            return 0;
        }
        add(a,b,idx);
        add(b,a,idx);
        idx++;
    }
    for(int i=1;i<=1000;i++){//max(a[i])=1e6 -> sqrt(max(a[i]))=1e3
        if(isprime(i)){
            bfs(i);
        }
    }
    if(ans==1e9)ans=-1;
    printf("%lld\n",ans);
    return 0;
}

Publicados 430 artículos originales · ganado elogios 36 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_44178736/article/details/104916693
Recomendado
Clasificación