AtCoder Beginner Contest 160 F Distributing Integers cambia la raíz dp + permutación y combinación

AtCoder Beginner Contest 160 El   número de concursantes es 9747   rápido, ver todas las preguntas 3 minutos después del inicio del concurso

AtCoder Beginner Contest 160 F Distributing Integers cambia la raíz dp + permutación y combinación

Ver https://blog.csdn.net/mrcrack/article/details/104454762 para el catálogo general

Dirección de evaluación en línea https://atcoder.jp/contests/abc160/tasks/abc160_f

Cambiar dp raíz Si no entiende, puede leer este artículo [codeforces 1187E] Tree Painting Cambiar dp raíz

Si no se puede calcular el elemento inverso factorial, puede ver los tres métodos rápidos de elemento inverso factorial en este documento.

1. La siguiente figura utiliza 3 como nodo raíz, el origen del cálculo del número de categorías 840

1.1 es el siguiente, el cálculo debe comenzar desde el nodo hoja, utilizando el principio de multiplicación de las matemáticas combinatorias, tenga en cuenta que 1 estos datos han sido ocupados por el nodo raíz 3

1.2 El nodo 3 y el nodo 6 se fusionan, hay un total de 6 datos disponibles, deduciendo los datos 1 ocupados por el nodo 3, y 5 datos restantes, asignados al grupo de nodos 6,7,8, que es el origen C (5,3)

 1.3 El nodo 3 y el nodo 2 se fusionan, hay un total de 8 datos disponibles, después de deducir los datos 1 ocupados por el nodo 3, quedan 7 datos, que se asignan a los nodos 1, 2 grupos, que es C (7,2)

2. Tome la muestra 4 como ejemplo para mostrar el proceso de generación de fuerza bruta de datos. Si no tiene claro el proceso de generación de datos, puede ver el contenido de la parte dfs1 en el código AC .

2.1 Tomando 1 como raíz, el proceso de generación de datos correspondiente es el siguiente

para [u] = la [i] * a [u] * C (OT [en] -1, S [i]);

pre [u] es el número de disposición del subárbol enraizado por u, sz [u] es el número de nodos del subárbol enraizado por u

sz[8]=1 pre[8]=1 sz[6]=2 pre[6]=1
sz[7]=1 pre[7]=1 sz[6]=3 pre[6]=2
sz[6]=3 pre[6]=2 sz[3]=4 pre[3]=2
sz[5]=1 pre[5]=1 sz[3]=5 pre[3]=8
sz[4]=1 pre[4]=1 sz[3]=6 pre[3]=40
sz[3]=6 pre[3]=40 sz[2]=7 pre[2]=40
sz[2]=7 pre[2]=40 sz[1]=8 pre[1]=40
sz[1]=8
sz[2]=7
sz[3]=6
sz[4]=1
sz[5]=1
sz[6]=3
sz[7]=1
sz[8]=1
pre[1]=40
pre[2]=40
pre[3]=40
pre[4]=1
pre[5]=1
pre[6]=2
pre[7]=1
pre[8]=1

2.2 Tomando 2 como raíz, el proceso de generación de datos correspondiente es el siguiente

 

sz[8]=1 pre[8]=1 sz[6]=2 pre[6]=1
sz[7]=1 pre[7]=1 sz[6]=3 pre[6]=2
sz[6]=3 pre[6]=2 sz[3]=4 pre[3]=2
sz[5]=1 pre[5]=1 sz[3]=5 pre[3]=8
sz[4]=1 pre[4]=1 sz[3]=6 pre[3]=40
sz[3]=6 pre[3]=40 sz[2]=7 pre[2]=40
sz[1]=1 pre[1]=1 sz[2]=8 pre[2]=280
sz[1]=1
sz[2]=8
sz[3]=6
sz[4]=1
sz[5]=1
sz[6]=3
sz[7]=1
sz[8]=1
pre[1]=1
pre[2]=280
pre[3]=40
pre[4]=1
pre[5]=1
pre[6]=2
pre[7]=1
pre[8]=1

2.3 Con 3 como raíz, el proceso de generación de datos correspondiente es el siguiente

sz[8]=1 pre[8]=1 sz[6]=2 pre[6]=1
sz[7]=1 pre[7]=1 sz[6]=3 pre[6]=2
sz[6]=3 pre[6]=2 sz[3]=4 pre[3]=2
sz[5]=1 pre[5]=1 sz[3]=5 pre[3]=8
sz[4]=1 pre[4]=1 sz[3]=6 pre[3]=40
sz[1]=1 pre[1]=1 sz[2]=2 pre[2]=1
sz[2]=2 pre[2]=1 sz[3]=8 pre[3]=840
sz[1]=1
sz[2]=2
sz[3]=8
sz[4]=1
sz[5]=1
sz[6]=3
sz[7]=1
sz[8]=1
pre[1]=1
pre[2]=1
pre[3]=840
pre[4]=1
pre[5]=1
pre[6]=2
pre[7]=1
pre[8]=1

2.4 Tome 4 como raíz, el proceso de generación de datos correspondiente es el siguiente

 

sz[8]=1 pre[8]=1 sz[6]=2 pre[6]=1
sz[7]=1 pre[7]=1 sz[6]=3 pre[6]=2
sz[6]=3 pre[6]=2 sz[3]=4 pre[3]=2
sz[5]=1 pre[5]=1 sz[3]=5 pre[3]=8
sz[1]=1 pre[1]=1 sz[2]=2 pre[2]=1
sz[2]=2 pre[2]=1 sz[3]=7 pre[3]=120
sz[3]=7 pre[3]=120 sz[4]=8 pre[4]=120
sz[1]=1
sz[2]=2
sz[3]=7
sz[4]=8
sz[5]=1
sz[6]=3
sz[7]=1
sz[8]=1
pre[1]=1
pre[2]=1
pre[3]=120
pre[4]=120
pre[5]=1
pre[6]=2
pre[7]=1
pre[8]=1

2.5 toma 5 como raíz, y el proceso de generación de datos correspondiente es el siguiente

 

sz[8]=1 pre[8]=1 sz[6]=2 pre[6]=1
sz[7]=1 pre[7]=1 sz[6]=3 pre[6]=2
sz[6]=3 pre[6]=2 sz[3]=4 pre[3]=2
sz[4]=1 pre[4]=1 sz[3]=5 pre[3]=8
sz[1]=1 pre[1]=1 sz[2]=2 pre[2]=1
sz[2]=2 pre[2]=1 sz[3]=7 pre[3]=120
sz[3]=7 pre[3]=120 sz[5]=8 pre[5]=120
sz[1]=1
sz[2]=2
sz[3]=7
sz[4]=1
sz[5]=8
sz[6]=3
sz[7]=1
sz[8]=1
pre[1]=1
pre[2]=1
pre[3]=120
pre[4]=1
pre[5]=120
pre[6]=2
pre[7]=1
pre[8]=1

2.6 toma 6 como raíz, y el proceso de generación de datos correspondiente es el siguiente

 

sz[8]=1 pre[8]=1 sz[6]=2 pre[6]=1
sz[7]=1 pre[7]=1 sz[6]=3 pre[6]=2
sz[5]=1 pre[5]=1 sz[3]=2 pre[3]=1
sz[4]=1 pre[4]=1 sz[3]=3 pre[3]=2
sz[1]=1 pre[1]=1 sz[2]=2 pre[2]=1
sz[2]=2 pre[2]=1 sz[3]=5 pre[3]=12
sz[3]=5 pre[3]=12 sz[6]=8 pre[6]=504
sz[1]=1
sz[2]=2
sz[3]=5
sz[4]=1
sz[5]=1
sz[6]=8
sz[7]=1
sz[8]=1
pre[1]=1
pre[2]=1
pre[3]=12
pre[4]=1
pre[5]=1
pre[6]=504
pre[7]=1
pre[8]=1

2.7 toma 7 como raíz, y el proceso de generación de datos correspondiente es el siguiente

 

sz[8]=1 pre[8]=1 sz[6]=2 pre[6]=1
sz[5]=1 pre[5]=1 sz[3]=2 pre[3]=1
sz[4]=1 pre[4]=1 sz[3]=3 pre[3]=2
sz[1]=1 pre[1]=1 sz[2]=2 pre[2]=1
sz[2]=2 pre[2]=1 sz[3]=5 pre[3]=12
sz[3]=5 pre[3]=12 sz[6]=7 pre[6]=72
sz[6]=7 pre[6]=72 sz[7]=8 pre[7]=72
sz[1]=1
sz[2]=2
sz[3]=5
sz[4]=1
sz[5]=1
sz[6]=7
sz[7]=8
sz[8]=1
pre[1]=1
pre[2]=1
pre[3]=12
pre[4]=1
pre[5]=1
pre[6]=72
pre[7]=72
pre[8]=1

2.8 toma 8 como raíz, y el proceso de generación de datos correspondiente es el siguiente

 

sz[7]=1 pre[7]=1 sz[6]=2 pre[6]=1
sz[5]=1 pre[5]=1 sz[3]=2 pre[3]=1
sz[4]=1 pre[4]=1 sz[3]=3 pre[3]=2
sz[1]=1 pre[1]=1 sz[2]=2 pre[2]=1
sz[2]=2 pre[2]=1 sz[3]=5 pre[3]=12
sz[3]=5 pre[3]=12 sz[6]=7 pre[6]=72
sz[6]=7 pre[6]=72 sz[8]=8 pre[8]=72
sz[1]=1
sz[2]=2
sz[3]=5
sz[4]=1
sz[5]=1
sz[6]=7
sz[7]=1
sz[8]=8
pre[1]=1
pre[2]=1
pre[3]=12
pre[4]=1
pre[5]=1
pre[6]=72
pre[7]=1
pre[8]=72

3. Tome la muestra 4 como ejemplo para mostrar el proceso de generación de datos para la generación de dp raíz

3.1 Con 1 como raíz, el proceso de generación de datos correspondiente es el siguiente

pre [u] es el número de disposición del subárbol enraizado por u, sz [u] es el número de nodos del subárbol enraizado por u

sz[8]=1 pre[8]=1 sz[6]=2 pre[6]=1
sz[7]=1 pre[7]=1 sz[6]=3 pre[6]=2
sz[6]=3 pre[6]=2 sz[3]=4 pre[3]=2
sz[5]=1 pre[5]=1 sz[3]=5 pre[3]=8
sz[4]=1 pre[4]=1 sz[3]=6 pre[3]=40
sz[3]=6 pre[3]=40 sz[2]=7 pre[2]=40
sz[2]=7 pre[2]=40 sz[1]=8 pre[1]=40
sz[1]=8
sz[2]=7
sz[3]=6
sz[4]=1
sz[5]=1
sz[6]=3
sz[7]=1
sz[8]=1
pre[1]=40
pre[2]=40
pre[3]=40
pre[4]=1
pre[5]=1
pre[6]=2
pre[7]=1
pre[8]=1

v es la raíz de la próxima búsqueda, u es la raíz actual y tp [v] representa el valor de pre [u] cuando se toma v como raíz.

tp [v] = ans [u] / pre [v] / C (n-1, sz [v]);

ans [u] = tp [v] * pre [u] * C (n-1, n-sz [u]);

ans[1]=40 u=2 fa=1
tp[2]=ans[1]/pre[2]/C(n-1,sz[1])=40/40/C(7,7)=1
ans[2]=tp[2]*pre[2]*C(n-1,n-sz[2])=1*40*C(7,1)=280

ans[2]=280 u=3 fa=2
tp[3]=ans[2]/pre[3]/C(n-1,sz[2])=280/40/C(7,6)=1
ans[3]=tp[3]*pre[3]*C(n-1,n-sz[3])=1*40*C(7,2)=840

u=6 fa=3
u=8 fa=6
u=7 fa=6
u=5 fa=3
u=4 fa=3
40
280
840
120
120
504
72
72

La idea es la misma que https://www.cnblogs.com/JohnRan/p/12591555.html

F. Déle un árbol de n nodos, ponga 1-n en orden y coloque la condición de que otro punto de este lado ya haya colocado un número. Encuentre el número de soluciones para poner 1 en los nodos 1-n.

  Debido a que requiere el número de soluciones para poner 1 en el nodo 1-n, la raíz dp se establece explícitamente (tal vez hay otras formas, pero no lo haré. Primero, considere cómo contar el operando al poner 1 en el nodo 1 .

  Sea pre [v] el número de arreglos del subárbol enraizados en v. Esta vez es un simple principio de multiplicación, primero seleccione y luego coloque en la disposición del subárbol. La primera vez que dfs puede procesar todos los pre []. Al cambiar de raíz

  Primero debemos tener en cuenta que cuando el hijo de u v es la raíz, primero debemos obtener u como el pre [u] del subárbol v. Obviamente (puede necesitar escribir un poco en el papel, el principio es seleccionar y luego ordenar) es ans [u] / (pre [v] * C (n-1, sz [v])), después de saber esto, obtenga ans [v] Pero solo para ti

  Este subárbol selecciona nuevamente algunos números, obviamente C (n-1, n-sz [v]). Según el método de cálculo de la respuesta u, se puede aplicar directamente a v; consulte el código para obtener más detalles.

El código AC es el siguiente

#include <cstdio>
#include <algorithm>
#define LL long long
#define mod 1000000007
#define maxn 200010
using namespace std;
LL fact[maxn],inv[maxn];
int n,head[maxn],cnt,sz[maxn];//sz[u]是以u为根的子树的节点数
LL pre[maxn],ans[maxn],tp[maxn];//pre[u]是以u为根的子树的安排方式数
struct node{
	int to,next;
}e[maxn<<1];
void add_edge(int u,int v){//邻接表
	cnt++,e[cnt].to=v,e[cnt].next=head[u],head[u]=cnt;
}
LL quick_pow(LL a,LL b){//快速幂
	LL ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
void init(){
	int i,u,v;
	scanf("%d",&n);
	for(i=1;i<n;i++){
		scanf("%d%d",&u,&v);
		add_edge(u,v),add_edge(v,u);//无向图
	}
	fact[0]=1;
	for(i=1;i<=n;i++)fact[i]=fact[i-1]*i%mod;
	inv[n]=quick_pow(fact[n],mod-2);
	for(i=n-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
}
LL C(int a,int b){//组合数计算
	return fact[a]*inv[a-b]%mod*inv[b]%mod;
}
void dfs1(int u,int fa){
	int b,v;
	sz[u]=1,pre[u]=1;
	for(b=head[u];b;b=e[b].next){
		v=e[b].to;
		if(v==fa)continue;
		dfs1(v,u);
		sz[u]+=sz[v];
		pre[u]=pre[v]*pre[u]%mod*C(sz[u]-1,sz[v])%mod;
	}
}
void dfs2(int u,int fa){//换根dp
	int b,v;
	ans[u]=tp[u]*pre[u]%mod*C(n-1,n-sz[u])%mod;
	for(b=head[u];b;b=e[b].next){
		v=e[b].to;
		if(v==fa)continue;
		tp[v]=ans[u]*quick_pow(pre[v]*C(n-1,sz[v])%mod,mod-2)%mod;//v是下一次搜索的根,u是当前的根,tp[v]代表在以v为根时,pre[u]的值。
		dfs2(v,u);
	}
}
int main(){
	init();
	dfs1(1,0);
	tp[1]=1;
	dfs2(1,0);
	for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);
	return 0;
}

 

 

Publicado 660 artículos originales · elogiado 562 · 480,000 visitas

Supongo que te gusta

Origin blog.csdn.net/mrcrack/article/details/105207929
Recomendado
Clasificación