luz BJOI2019

Ochiya

Solución

Considere un finales efectos de luz son sólo dos: o bien hacia abajo en el vidrio o en el cristal hacia arriba. Reivindicamos está reduciendo de \ (n \) la cantidad de la capa de vidrio.

Por lo tanto, se establece para cada modo de acción desconocido, o puede ser entendida como una amplia DP:

  • Set \ (F_i \) para introducir los primero hacia abajo \ (I \) capas de unidades de luz de cristal
  • Set \ (g_i \) es hacia arriba en la sección \ (I \) capas de unidades de luz de cristal

Como se muestra, la línea de negro es el vidrio, línea de referencia negro digital en la izquierda es un vidrio, una primera línea es la luz azul, la luz roja es la segunda luz.

La igualdad entre las ecuaciones

Obviamente, teniendo en cuenta el papel de cada uno de los rayos de luz por lo que puede ser obtenida por la conversión, en donde la atención modalidad de conversión es una proyección de reflexión:

  • \ (= F_1. 1 \) , la luz entrante inicial.

  • \ (F_i \ (2 \ i Le \ n-Le) = A_ {I -. 1} \ {F_% · I -. B_ 1} + I {-} 1 \% \ I CDOT G_. {-}. 1 \) . (Transferencia modo verde flecha).

  • \ (g_n = 0 \) .

  • \ (G_ {i} \ ( 1 \ le i <n) = a_ {i + 1} \% \ cdot g_ {i + 1} + b_ {i + 1} \% \ cdot f_ {i + 1} \ ) . (Transferencia modo de naranja flecha).

Por lo tanto, hemos construido una buena 2n $ $ $ incógnitas, 2n ecuaciones $ conjunto de ecuaciones.

Encontrado que si se sabe \ (F_ {I}, G_ {I} \) , se puede introducir \ (F_ {I +. 1}, G_ {I +. 1} \) , ya que \ (F_1 = 0 \) , pueden desear establecer \ ( = el X-G_1 \) . Entonces todo número puede expresarse como \ (ax + b \) formulario. Finalmente fin de empujar \ (g_n = 0 \) se calcula \ (X \) , y finalmente en el \ (X \) calculado en el correspondiente \ (F_n \) .

#include <iostream>
#include <cstdio>

using namespace std;

typedef long long LL;

const int N = 500005, P = 1e9 + 7;

int n, a[N], b[N], f[N][2], g[N][2];

int inline power(int a, int b) {
	int res = 1;
	while (b) {
		if (b & 1) res = (LL)res * a % P;
		a = (LL)a * a % P;
		b >>= 1;
	}
	return res;
}

int main() {
	scanf("%d", &n);
	int inv = power(100, P - 2);
	for (int i = 1; i <= n; i++) {
		scanf("%d%d", a + i, b + i);
		a[i] = (LL)a[i] * inv % P, b[i] = (LL)b[i] * inv % P;
	}
	f[1][0] = 1, g[1][1] = 1;
	for (int i = 2; i <= n; i++) {
		f[i][0] = ((LL)a[i - 1] * f[i - 1][0] + (LL)b[i - 1] * g[i - 1][0]) % P;
		f[i][1] = ((LL)a[i - 1] * f[i - 1][1] + (LL)b[i - 1] * g[i - 1][1]) % P;
		g[i][0] = (g[i - 1][0] - (LL)f[i][0] * b[i] % P + P) * power(a[i], P - 2) % P;
		g[i][1] = (g[i - 1][1] - (LL)f[i][1] * b[i] % P + P) * power(a[i], P - 2) % P;
	}
	int x = (LL)(P - g[n][0]) * power(g[n][1], P - 2) % P;
	printf("%lld\n", (f[n][0] + (LL)f[n][1] * x % P) * a[n] % P);
	return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/dmoransky/p/12571615.html
Recomendado
Clasificación