HDUOJ 6825 Set1
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 | = 1∣ s ∣=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-yo≤yo-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 )=2∗yo-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;
}