HDUOJ 6825 Set1

HDUOJ 6825 Set1

Enlace de tema

Descripción del problema

Se le da un conjunto S = {1… n}. Garantiza que n es impar. Tienes que hacer las siguientes operaciones hasta que solo quede 1 elemento en el conjunto:

En primer lugar, elimine el elemento más pequeño de S. Luego, elimine aleatoriamente otro elemento de S.

Para cada i∈ [1, n], determine la probabilidad de que i quede en el S.

Se puede demostrar que las respuestas se pueden representar mediante PQ, donde P y Q son enteros coprimos, e imprimir el valor de P × Q − 1 mod 998244353.

Entrada

La primera línea que contiene el único número entero T (T∈ [1,40]) indica el número de casos de prueba.

Para cada caso de prueba:

La primera línea contiene un número entero n.

Garantiza que: ∑n∈ [1,5e6].

Salida

Para cada caso de prueba, debe generar n números enteros, i-ésimo de ellos significa la probabilidad de que yo quede en S.

Entrada de muestra

1
3

Salida de muestra

0 499122177 499122177

Hay un problema con la solución. La revisé:

Problema: Dado un conjunto S, elimine el elemento más pequeño del conjunto actual cada vez y luego elimine aleatoriamente 1 elemento hasta que ∣ s ∣ = 1 | s | = 1s =1. Calcula la probabilidad de que cada elemento se quede al final.

  • Considere el elemento iii es el número de soluciones que quedan,i - 1 i-1 alfrenteyo-1 elemento, seguido den - i ninorte-i elementos.
  • Actualmente solo cuando n - i ≤ i - 1 ni \ leq i-1norte-yoyo-En 1 ,iii puede quedarse atrás.
  • Cada vez que el elemento más pequeño se elimina como operación 1, y un elemento aleatorio se elimina como operación 2
  • Mayor que el elemento iiLos elementos de i deben eliminarse mediante la operación 2
    iiSi me queda atrás, deben ser todos los elementos siguientes (n - i ninorte-i ), todos los cuales están precedidos pori - 1 i-1yo-Uno de 1 elemento1 11 a1 11 opción (utilice la operación 2)
    • Entonces, para el último elemento, el número de opciones que se seleccionan es C i - 1 n - i ∗ (n - i)! = A i - 1 n - i C_ {i-1} ^ {ni} * (ni)! = A_ {i-1} ^ {ni}Cyo - 1n - i( n-i ) !=UNAyo - 1n - i
  • Entonces los elementos restantes (i - 1) - (n - i) = 2 ∗ i - n - 1 (i-1) - (ni) = 2 * in-1( yo-1 )-( n-yo )=2yo-norte-1 Eliminar en parejas.
    • Entonces el número de soluciones restantes es (2 ∗ i - n - 1)! (2 ∗ i - n - 1 2)! ∗ 2 2 ∗ i - n - 1 2 \ frac ((2 * in-1)! } {(\ frac {2 * in-1} {2})! * 2 ^ {\ frac {2 * in-1} {2}}}(22 * i - n - 1) ! 222 * i - n - 1( 2 * i - n - 1 ) !

La respuesta es multiplicar los dos, el código de CA es el siguiente:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const ll N=5e6+5;
int t;
ll n,F[N+1],I[N+1],cnt[N+1];
ll power(ll a,ll b){
    
    return b?power(a*a%mod,b/2)*(b%2?a:1)%mod:1;}
void init(){
    
    
    F[0]=1;
    for(ll i=1;i<=N;i++) F[i]=F[i-1]*i%mod;
    I[N]=power(F[N],mod-2);
    for(ll i=N;i--;){
    
    
        I[i]=I[i+1]*(i+1)%mod;
    }
}

ll C(ll n,ll k){
    
    
    return F[n]*I[n-k]%mod*I[k]%mod;
}

int main(){
    
    
    init();
    scanf("%d",&t);
    while(t--){
    
    
        scanf("%lld",&n);
        ll sum=0;
        for(ll i=1;i<=n;i++){
    
    
            if(2*i-n-1<0) cnt[i]=C(i-1,n-i)*F[n-i]%mod;
            else cnt[i]=C(i-1,n-i)*F[n-i]%mod*F[2*i-n-1]%mod*power(power(2,mod-2),(2*i-n-1)/2)%mod*I[(2*i-n-1)/2]%mod;
            sum=(sum+cnt[i])%mod;
        }
        for(ll i=1;i<=n;i++){
    
    
            if(i>1) printf(" ");
            printf("%lld",cnt[i]*power(sum,mod-2)%mod);
        }
        printf("\n");
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43765333/article/details/108679134
Recomendado
Clasificación