[Concurso de programación en línea de Super Code Power preliminar (2)] 4. Número de Schroder piramidal de Xiaoqi (Número de Super Cattelan)

Enlace de tema: La pirámide de Xiaoqi

Título

Imagen del tema
Xiaoqi puede moverse entre diferentes puntos, supongamos que Xiaoqi ahora está en (x 1, y 1) {(x_1, y_1)}( x1,y1) , El siguiente punto al que puede moverse(x 2, y 2) {(x_2, y_2)}( x2,y2)满足(x 2> = x 1 & & y 2> = y 1) {(x_2> = x_1 \ & \ & y_2> = y_1)}X2> =X1& & y2> =y1) . Ahora Xiaoqi permanece en(k, k) ((k, k))( k ,En k ) , dado que no estamos seguros de dónde está Xiaoqi ahora, debe solicitar la suma del número de planes alcanzados en todos los puntos.

responder

Puede hacer esta pregunta si incursiona en los números de Cattleya.
Es un poco difícil presionar directamente. En el juego, siento que es poco probable que lo elimine.

En esta pregunta, Xiaoqi puede caminar tres puntos (x 1 + 1, y 1), (x 1, y 1 + 1), (x 1 + 1, y 1 + 1) {(x_1 + 1, y_1), (x_1 , y_1 + 1), (x_1 + 1, y_1 + 1)}( x1+1 ,y1) ( X1,y1+1 ) ( x1+1 ,y1+1 ) , que es exactamente igual que el ejemplo del número de Schroder (número super Cattelan). Dado que toda la cuadrícula es triangular, el de la derecha es(k, k) {(k, k)}( k ,k ) es equivalente a reemplazar "y = x esta línea recta", de esta manera podemos obtener fácilmente la respuesta al número de Schroder (número Super Cattelan).

La fórmula de recurrencia del número de Schroder (número super Cattelan):
(n + 1) ∗ S n = (6 n - 3) ∗ S n - 1 - (n - 2) ∗ S n - 2 {(n + 1) * S_n = (6n-3) * S_ {n-1} - (n-2) * S_ {n-2}}( n+1 )Sn=( 6 n-3 )Sn - 1-( n-2 )Sn - 2S 0 = 1, S 1 = 1 {S_0 = 1, S_1 = 1}S0=1 ,S1=1 )
Debido al módulo, encuentresn {s_n}snCuando, ambos lados se multiplican por el inverso de (n + 1).

Tenga en cuenta la secuencia S n {S_n} entregada aquíSnNo es directamente el número de Schroder (número de Super Cattelan), pero a excepción del primer término, el resto es la mitad del número de Schroder (número de Super Cattelan), así que recuerde multiplicar por 2.

Tenga en cuenta que n ≠ k.size () en el título. Al principio, seguí presionando n para escribir y causé una falla de segmento, y finalmente cambié a k.size () .

Código

typedef long long ll;
ll mod=1e9+7;

class Solution {
    
    
public:
	/**
	 * @param n: The number of pyramid levels n
	 * @param k: Possible coordinates k
	 * @return: Find the sum of the number of plans
	 */
	 ll f[10000010];
	ll qpow(ll a, ll b)
	{
    
    
		ll ans=1;
		while(b)
		{
    
    
			if(b&1) ans=ans*a%mod;
			a=a*a%mod;
			b>>=1;
		}
		return (ans+mod)%mod;
	}
	int pyramid(int n, vector<int> &k) {
    
    
		// write your code here
		f[1]=f[0]=1;
		for(int i=2;i<=n;i++)
		{
    
    
			f[i]=((6*i-3)*f[i-1]%mod-(i-2)*f[i-2]%mod+mod)%mod*qpow(i+1,mod-2)%mod;	
		}
		ll ans=0;
		for(int i=0;i<k.size();i++) 
		{
    
    
			if(n==k[i]) ans=(ans+f[n-k[i]])%mod;
			else ans=(ans+f[n-k[i]]*2%mod)%mod;
		}
		return ans;
	}
};

Supongo que te gusta

Origin blog.csdn.net/weixin_44235989/article/details/108329386
Recomendado
Clasificación