Teoría de números:
1. Número primo
① 定义 法 : O (n)
n> = 2 && i <= n-1
②Método de propiedad: O (sqrt (n))
aparece en pares.
Si d puede dividir n, entonces n / d también puede dividir n.
D y n / d son un par,
entonces solo necesitamos enumerar al más pequeño.
Respuesta : d <= n / d,
d d <= n PS: No se recomienda este método de escritura. Si n está cerca del valor máximo de int, entonces d d puede tener riesgo de desbordamiento
d <= sqrt (n) PS: Este método de escritura no se recomienda porque la función se llama cada vez, lo cual es ineficiente.
2. Los
divisores son opuestos
a los números primos y la práctica es la misma que la de los números primos.
Colección consolidada : 836. Enlace del título de la colección consolidada
Es lo mismo que el kruscal que aprendí antes.
#include<iostream>
using namespace std;
const int N=100000+10;
int n,m;
int father[N];
int find(int x){
return father[x]==x?x:father[x]=find(father[x]);
}
void my_union(int a, int b){
int xx=find(a);
int yy=find(b);
if(xx!=yy){
if(yy>xx){
father[yy]=xx;
}else{
father[xx]=yy;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
father[i]=i;
}
while(m--){
char s[2];
int a,b;
cin>>s>>a>>b;
if(s[0]=='M'){
my_union(a,b);
}else{
if(find(a)==find(b)){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
}
return 0;
}
La aplicación ampliada del conjunto de búsqueda de unión:
837. Vínculos al número de puntos en bloques conectados
Transformar sobre la base de fusionar y recopilar el código original.
#include<iostream>
using namespace std;
const int N=100000+10;
int n,m;
int father[N];
int se[N];
int find(int x){
return father[x]==x?x:father[x]=find(father[x]);
}
void my_union(int a, int b){
int xx=find(a);
int yy=find(b);
if(xx!=yy){
if(yy>xx){
se[xx]+=se[yy];
father[yy]=xx;
}else{
se[yy]+=se[xx];
father[xx]=yy;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
father[i]=i;
se[i]=1;
}
while(m--){
char s[5];
int a,b;
cin>>s;
if(s[0]=='C'){
cin>>a>>b;
my_union(a,b);
}else if(s[1]=='1'){
cin>>a>>b;
if(find(a)==find(b)){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}else{
cin>>a;
int f=find(a);
cout<<se[f]<<endl;
}
}
return 0;
}
240. Preguntas prácticas sobre la cadena alimentaria y la recolección
ps: la forma recursiva de búsqueda dp-memoized (el intervalo dp es mejor para entender cuando se escribe como recursividad)