Cod sursa(job #908817)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 10 martie 2013 00:06:33
Problema Cast Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#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;
}