Pagini recente » Cod sursa (job #1479168) | Cod sursa (job #926836) | Cod sursa (job #1668262) | Cod sursa (job #2573047) | Cod sursa (job #908817)
Cod sursa(job #908817)
#include <fstream>
#include <vector>
#define MAX 15
#define pb push_back
#define REST 30103
using namespace std;
int N, M;
short edges[(1 << MAX)];
long long dp[(1 << MAX)], dp2[(1 << MAX)];
vector<int> V[MAX];
void citire() {
ifstream in("ndap.in");
in>>N>>M;
for(int i = 1, A, B; i <= M; i++) {
in>>A>>B;
V[A].pb(B);
V[B].pb(A);
}
}
void solve(int conf) {
if(dp2[conf] != -1) return;
vector<short> bits;
for(int i = 0; i < N; i++)
if(conf & (1 << i)) bits.push_back(i);
for(int conf2 = 1; conf2 < (1 << bits.size()); conf2++) {
if(!(conf2 & 1)) continue;
int resultingConf = conf;
for(size_t i = 0; i < bits.size(); i++)
if(conf2 & (1 << i)) resultingConf ^= (1 << bits[i]);
if(resultingConf) {
solve(conf ^ resultingConf);
dp2[conf] = (dp2[conf] + dp[conf ^ resultingConf] * edges[resultingConf]);
} else dp2[conf]++;
}
dp[conf] = (edges[conf] - dp2[conf]);
}
int main()
{
citire();
dp[0] = dp2[0] = -1;
for(int conf = 1; conf < (1 << N); conf++) {
dp[conf] = dp2[conf] = -1;
int cnt = 0;
for(int i = 0; i < N; i++) {
if(conf & (1 << i)) {
for(size_t j = 0; j < V[i].size(); j++)
if(conf & (1 << V[i][j]))
cnt++;
}
} cnt /= 2;
edges[conf] = 1;
for(; cnt > 0; cnt -= 30)
edges[conf] = (1LL * edges[conf] * (1 << min(30, cnt))) % REST;
}
solve((1 << N) - 1);
dp[(1 << N) - 1] %= REST;
if(dp[(1 << N) - 1] < 0) dp[(1 << N) - 1] += REST;
ofstream out("ndap.out"); out<<dp[(1 << N) - 1] % REST; out.close();
return 0;
}