[51nod 1850] llamar la competencia de la tarjeta

Descripción del problema

51Nod para darle vida antes de la carrera, juegos organizados atraen juego de cartas. El juego total de n individuos para participar, según los organizadores de África y Europa evaluador de descenso, obtener algunos datos. tarjeta de sorteo a todos Mi posible, la capacidad de obtener el valor de la tarjeta Aij consideración de la posibilidad de Gijón es Pij, llamado El precio se refiere a los jugadores necesitan ser obtenido después de cabeceo escudo redondo Gij% a los organizadores. Todo el mundo cada ronda seleccionados al azar tarjetas, hasta que todas las personas extraídos Después de la terminación clasifican (en orden descendente de las filas A), en la posición i-ésima fila de la persona que ha asentido ganancias protegen Vi. Ahora organizadores quieren saber después de un partido que todos esperaban ingresos.

Formato de entrada

El primer número entero positivo n una fila
siguiente n partes
cada parte del comportamiento de la primera entero positivo Mi, Mi siguiente línea tiene tres números enteros Aij Gij Pij
siguiente línea n números enteros, respectivamente Vi
proporcionado ΣPij = Qi, la primera probabilidad de individuos j i dibujado tarjeta es Pij es / Qi
. 1 <= n-, Mi <= 1/200, <Aij = <= 1000000000, diferentes unos de otros para asegurar que Aij, 0 <= Gij <= 100,1 <= Pij <= 1000,1 <= Vi <= 1000

Formato de salida

líneas de salida N, cada número de línea representados por un ingreso deseado por persona
con el fin de evitar que el error de precisión, el valor de salida de la respuesta en el troquel 1E9 + 7 sentido

entrada de la muestra

2
2
3 50 5
4 50 5
2
5 50 5
6 50 5
2 2

Ejemplo de salida

1
1

Resolver

O (n ^ 4) enfoque señorita comparación. Recordemos que este enfoque se puede encontrar lo más problemático es encontrar la probabilidad de que la cantidad de clasificación de cada persona. Considere la optimización del proceso.

Supongamos que la cuenta corriente de las \ (i \) individuos. Set \ (P_j \) representa \ (j \) las clasificaciones individuales que \ (i \) delante de la probabilidad, \ (f [j] \) denota \ (i \) las clasificaciones individuales para la probabilidad de j. Combinación de la función de generación de conocimiento, \ (f \) función número de generación de secuencia es el

\ [\ Prod_ {j! = I} P_j \ veces x + (1-P_j) \]

\ (F [i] \) es decir, después de la entrada i-1 veces correspondiente a la anterior expansión polinómica. Por lo tanto, vamos a todas las cartas de acuerdo con un orden descendente, si la tarjeta de corriente correspondiente al rango de la persona a la espalda, es necesario seleccionar una tarjeta en la tarjeta anterior. Tenemos que mantener el polinomio anterior. Específicamente, ajuste el hecho por el hombre i, entonces actual \ (p [j] \) es la probabilidad de que todas las cartas delante de y j aparecer. Desde el encuentro polinomio \ (i! = J \) , queremos dar a conocer un polinomio se divide por \ (P_i \ Tiempo-P_i los ejes X + 1 \) , y luego se multiplica por \ (P_j \ Tiempo-P_j los ejes X + 1 \) . simular manualmente lo que dos proceso de multiplicación polinómica puede resolver este problema.

Por supuesto, se puede NTT

código

#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
#define N 202
using namespace std;
const int mod=1000000007;
struct card{
	int a,g,p,id;
}a[N*N];
int n,m[N],v[N],cnt,i,j,f[N],ans[N],p[N];
int read()
{
	char c=getchar();
	int w=0;
	while(c<'0'||c>'9') c=getchar();
	while(c<='9'&&c>='0'){
		w=w*10+c-'0';
		c=getchar();
	}
	return w;
}
int poww(int a,int b)
{
	int ans=1,base=a;
	while(b){
		if(b&1) ans=ans*base%mod;
		base=base*base%mod;
		b>>=1;
	}
	return ans;
}
int my_comp(const card &x,const card &y)
{
	return x.a>y.a;
}
signed main()
{
	n=read();
	for(i=1;i<=n;i++){
		m[i]=read();
		int inv=0;
		for(j=1;j<=m[i];j++){
			cnt++;
			a[cnt].a=read(),a[cnt].g=read(),a[cnt].p=read();
			a[cnt].id=i;
			a[cnt].g=(100-a[cnt].g)*poww(100,mod-2)%mod;
			inv=(inv+a[cnt].p)%mod;
		}
		inv=poww(inv,mod-2);
		for(j=1;j<=m[i];j++) a[cnt-j+1].p=a[cnt-j+1].p*inv%mod;
	}
	for(i=1;i<=n;i++) v[i]=read();
	sort(a+1,a+cnt+1,my_comp);
	f[1]=1;
	for(i=1;i<=cnt;i++){
		if(a[i-1].id!=a[i].id){
			int inv=poww(1-p[a[i].id]+mod,mod-2);
			f[1]=f[1]*inv%mod;
			for(j=2;j<=n;j++) f[j]=(f[j]-f[j-1]*p[a[i].id]%mod+mod)%mod*inv%mod;
			for(j=n;j>=1;j--) f[j]=(f[j]*(1-p[a[i-1].id]+mod)%mod+f[j-1]*p[a[i-1].id]%mod)%mod;
		}
		for(j=1;j<=n;j++) ans[a[i].id]=(ans[a[i].id]+f[j]*v[j]%mod*a[i].p%mod*a[i].g%mod)%mod;
		p[a[i].id]=(p[a[i].id]+a[i].p)%mod;
	}
	for(i=1;i<=n;i++) printf("%lld\n",ans[i]);
	return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/LSlzf/p/12616610.html
Recomendado
Clasificación