Matriz B-Simétrica (matemática + dp)

Conte o número de matrizes n × n A satisfazendo a seguinte condição módulo m.

  • Ai, j∈ {0,1,2} para todos 1≤i, j≤n.

  • Ai, j = Aj, i para todos 1≤i, j≤n.

  • Ai, 1 + Ai, 2 + ⋯ + Ai, n = 2 para todos 1≤i≤n.

  • A1,1 = A2,2 = ⋯ = An, n = 0.

Entrada
A entrada consiste em vários casos de teste e é finalizada pelo fim do arquivo.

Cada caso de teste contém dois inteiros n e m.

  • 1≤n≤105
  • 1≤m≤109
  • A soma de n não excede 107.

Saída
Para cada caso de teste, imprima um número inteiro que denota o resultado.

Exemplo de
entrada
3 1000000000
100000 1000000000
Saída
1
507109376
Explicação do cara grande.
Matriz de adjacência: dp [i] [j] = w: O peso entre o ponto i e o ponto j é
a matriz de adjacência de um gráfico não direcionado de w : satisfaz dp [i] [j] = dp [j] [i]
considere a matriz necessária como a matriz de adjacência do grafo não direcionado e o peso como o número de arestas conectadas. A
diagonal é 0, ou seja, a soma de
cada linha é 2, o que é compreensível. Sucesso significa que você tem duas arestas conectadas a um ponto ou conectou dois pontos diferentes.
Todos os pontos têm um grau 2 e há várias arestas, mas nenhum loop automático. Nesse caso, o gráfico possui vários anéis, ou seja, cada ponto está dentro e apenas em um anel. Porque uma vez que não há anel, deve haver um ponto com apenas um grau, o que contradiz as condições.
dp [n] é o esquema de
formação do anel do enésimo ponto. Caso 1 é autoanel: pegue um ponto de n-1 pontos para formar um novo anel com o enésimo ponto, então (n-1) * dp [n - 2] Esquema
Caso 2: Retire x pontos de n-1 pontos, e os pontos restantes e o enésimo ponto formam um novo anel, (2 <= x <= n − 3), ou seja, soma (C (n- 1, k) * dp [k] (n-1-k)! / 2) (2≤k≤n-3)
A simetria quando os pontos restantes dos esquemas são conectados ao novo ponto para formar um anel, então Divida por 2.
Porque se x = 1, o ponto tomado não pode formar um anel por si mesmo. Se x = n-2, é o caso 1/2, mas o caso 1 não precisa ser dividido por 2 e precisa ser listado separadamente.
Em seguida, a fórmula do caso 2 é simplificada para somar (dp (k) * (n-1)! / (2
k!))
f (n) = (n-1) f (n-2) + soma (k: 2-> n-3) f (k) (n-1)! / k! / 2
(n-1) f ( n-1) = (n-1) (n-2) f (n-3) + soma (k: 2-> n-4) f (k) (n-1)! / k! / 2
menos um Torna-se: f (n) = (n-1) f (n-1) + (n-1) f (n-2) - (n-1) (n-2) f (n-3) / 2

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,dp[100100];
int main()
{
    
    
	while(~scanf("%d%d",&n,&m))
	{
    
    
		dp[1]=0;dp[2]=1%m;dp[3]=1%m;
		for(ll i=4;i<=n;i++)
		 dp[i]=(((i-1)*dp[i-1]%m+(i-1)*dp[i-2]%m-(i-1)*(i-2)/2*dp[i-3]%m)%m+m)%m;
		printf("%d\n",dp[n]);
	}
}

Acho que você gosta

Origin blog.csdn.net/weixin_43540515/article/details/113095800
Recomendado
Clasificación