3,29 província divisão de jogos simulados selecionado e modulo contagem composições dp +

LINK: divisão e modulo

avatar

questões fantasma. Mas uma boa 50 minutos para escrever. Sem considerar o dp divisão de tempo na verdade é uma combinação da contagem.

Considere o tempo da forma necessária com a imprensa divisão para baixo operações de divisão.

Desde a operação de divisão não é afetado pelo tamanho dos x-moldado de modo a pressionar a operação de divisão.

Compressão directa é o número de estado binário sábio, no máximo, 13 2 2 ^ 13 também atinge o 1E4 complexidade.

Considere hash como a pressão que é o número 2 existem x então temos um estado w é 2 x número lá.

A razão para isso é mesclar algumas das mesmas coisas para eles em vez de fora spread. É assim que muitos mais podem ser gravados diretamente 2.

Você pode encontrar este diferentes divisores, no máximo, apenas uma quantidade relativamente pequena de cinco estados.

Como hash de considerar o que a próxima versão do hash usando P-band procura de tal decisão a também é muito conveniente.

Tais como: for i-th banda de (o número atual +1) modulo não precisamos de uma quantidade tão estado inferior a 100.

Esse hash podem ser encontrados não vazar desvantagem é que nós precisamos de saber o que um representante do estado é o valor do que significa se livrar de um estado seria.

X assim como o número de estados de transição de estado + x estado atual valor de x.

Este último é muito baixo, considerando a complexidade do ex-primeiro passo para fazê-lo quando x é dividido por 2 e meio não precisa enumerar o valor corrente de x para trás será cortado ao meio o que se torna 5000 5000 Estado dp da .

A segunda parte vai fazer quando dividido por 2 pode ser considerada inválida para o estado inválido de muitos de nosso estado não pode transferência de enumerar.

(1/16 dizer que há uma constante pode assim este problema em uma solução para um problema.

Ao comparar a transferência ex dp é importante notar que um número ou% dividido por um número de tempo, se há presença duplicado deve lidar com o que relacionamento relativo.

O primeiro é multiplicado por H [w] W // aparece muitas vezes que o número de remanescente após módulo está organizado em. não existe entre esses números é porque o arranjo teve.

Neste último selecção também descobriram que há g [j] [W] é multiplicado por este tipo de coisa que o programa.

de hash quando o Estado deve prestar atenção para o número de zeros quando um determinado número de representações. dp quando a atenção dos dois ciclos deve inverter enumeração.

Um muito excelente tema dp.

const int MAXN=200010,maxn=10010;
int a[MAXN],b[MAXN],q[MAXN],c[MAXN],w[MAXN],p[MAXN],vis[MAXN];
ll fac[MAXN<<1],inv[MAXN],in[MAXN],f[maxn][110];
int g[MAXN][10],v[MAXN],h[MAXN];
int n,m,maxx,s,top,sum,tot;
inline ll ksm(ll b,int p)
{
	ll cnt=1;
	while(p)
	{
		if(p&1)cnt=cnt*b%mod;
		b=b*b%mod;p=p>>1;
	}
	return cnt;
}
inline void prepare()
{
	fac[0]=1;in[1]=1;
	rep(1,maxx,i)
	{
		fac[i]=fac[i-1]*i%mod;
		if(i!=1)in[i]=(mod-mod/i)*in[mod%i]%mod;
	}
	inv[maxx]=ksm(fac[maxx],mod-2);
	fep(maxx-1,0,i)inv[i]=inv[i+1]*(i+1)%mod;
}
inline void get_state()
{
	int ww=0;
	rep(1,sum,i)ww=ww*(w[i]+1)+q[i];
	tot=max(tot,ww);
	rep(1,sum,i)g[ww][i]=q[i],v[ww]+=q[i];
}
inline void dfs(int x)
{
	if(x==sum+1)
	{
		get_state();
		return;
	}
	rep(0,w[x],i)
	{
		q[x]=i;
		dfs(x+1);
	}
}
int main()
{
	freopen("1.in","r",stdin);
	get(s);get(n);get(m);maxx=n+m;
	prepare();
	rep(1,n,i)
	{
		get(a[i]);
		if(a[i]>s){putl(fac[n+m]);return 0;}
	}
	ll ww=1;
	rep(1,n,i)
	{
		if(a[i]>1)q[++top]=a[i];
		ww=ww*a[i];
		if(ww>s){putl(fac[n+m]);return 0;}
	}
	sort(q+1,q+1+top);
	rep(1,top,i)
	{
		if(q[i]==q[i-1])++w[sum],++i;
		if(i<=top)c[++sum]=q[i],++w[sum];
	}
	p[sum]=1;
	fep(sum-1,1,i)p[i]=p[i+1]*(w[i]+1);
	dfs(1);//整理状态
	rep(1,m,i)get(b[i]),++vis[min(b[i],s+1)],++h[b[i]];
	rep(1,s+1,i)vis[i]+=vis[i-1];
	f[s][tot]=fac[n+m]*inv[n+m-(vis[s+1]-vis[s])-(n-top)]%mod;
	fep(s,0,i)
	{
		//if(i==0)cout<<"www"<<endl;
		fep(tot,0,j)
		{
			if(!f[i][j])continue;
			//枚举要取模的数字.
			rep(1,i,k)
			{
				if(!h[k])continue;
				//当前还有数字为 v[j]+vis[i]-1
				//剩余有效数字为 v[j]+vis[i%k]
				f[i%k][j]=(f[i%k][j]+h[k]*f[i][j]%mod*fac[v[j]+vis[i]-1]%mod*inv[v[j]+vis[i%k]]%mod)%mod;
			}
			rep(1,sum,k)//枚举要除以的数字.
			{
				if(g[j][k])
				{
					//当前还有数字为 v[j]-1+vis[i]
					//剩余有效数字为 v[j]-1+vis[i/c[k]]
					f[i/c[k]][j-p[k]]=(f[i/c[k]][j-p[k]]+g[j][k]*f[i][j]%mod*fac[v[j]-1+vis[i]]%mod*inv[v[j]-1+vis[i/c[k]]]%mod)%mod;
				}
			}
		}
	}
	/*fep(s,0,i)
	{
		cout<<i<<' '<<"www"<<' ';
		fep(tot,0,j)
		cout<<f[i][j]<<' ';
		cout<<endl;
	}*/
	putl(f[0][0]);
	return 0;
}

Acho que você gosta

Origin www.cnblogs.com/chdy/p/12612164.html
Recomendado
Clasificación