Pagini recente » Cod sursa (job #398938) | Cod sursa (job #1773061) | Cod sursa (job #1466928) | Cod sursa (job #1695847) | Cod sursa (job #1824324)
#include<cstdio>
#include<vector>
using namespace std;
long long ap[251][251], dp[2][(1<<15)+3][16];
long long l, aux, p, s, i, j, x, y, n, m, poz, k, t ;
vector < int > h[18];
int main()
{
freopen("ture.in","r",stdin);
freopen("ture.out","w",stdout);
scanf("%d%d%d%d", &n, &m, &p, &poz);
for(i = 1;i <= poz; i++)
{
scanf("%d%d", &x, &y);
if(n<m)
{
aux=x;
x=y;
y=aux;
}
ap[x][y]=1;
}
if(n<m)
{
aux=n;
n=m;
m=aux;
}
for(i = 0;i < (1<<m); i++)
{
t = 0;
for(j = 0;j < m;j++)
if(i& (1 << j)) t++;
h[t].push_back(i);
}
for(i = 1;i <= n; i++)
{
for(j = 1;j <= m; j++)
{
if(ap[i][j] == 0)
dp[i % 2][(1 << (j-1))][1] = 1 + dp[(i-1) % 2][(1 << (j-1))][1];
else
dp[i % 2][(1 << (j-1))][1] = dp[(i-1) % 2][(1 << (j-1))][1];
}
for(k = 2;k <= p && k <= i; k++)
for(l = 0;l < h[k].size(); l++)
{
j = h[k][l];
dp[i % 2][j][k] = dp[(i-1) % 2][j][k];
for(t = 1; t<= m; t++)
if((j & (1 << (t-1))) > 0&& ap[i][t] == 0)
dp[i % 2][j][k] += dp[(i-1) % 2][j-(1<< (t-1))][k-1];
}
}
s=0;
for(j=0;j < h[p].size(); j++)
s += dp[n % 2][h[p][j]][p];
printf("%lld\n",s);
return 0;
}