Cod sursa(job #2452851)

Utilizator CharacterMeCharacter Me CharacterMe Data 1 septembrie 2019 14:23:20
Problema Divk Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>
///N=100000
///preprocesare 22*(2^22)
using namespace std;
///
typedef long long ll;
ll n, i, j, k, cnt, out;
ll sol[4194305], lst[23], val[23], last[23];
///
void preproc(ll config);
void solve();
///
int main()
{
    freopen("coins.in", "r", stdin);
    freopen("coins.out", "w", stdout);
    sol[0]=true;
    for(i=1; i<(1<<22); ++i) preproc(i);
    solve();
    fclose(stdin);
    fclose(stdout);
    return 0;
}
void preproc(ll config){
    ll conf=config, i, l, cnt=0;
    l=0;
    for(i=22; i>=1; --i) {
        val[i]=conf&1;
        conf>>=1;
        if(val[i]) last[i]=l;
        else l=i;
    }
    bool good=false;
    for(i=22; i>=1; --i){
        if(val[i] && last[i]){
            ll c=config;
            c^=1<<(22-i);
            ++cnt;
            c^=(1<<(22-last[i]));
            if(sol[c]==-1) {
                good=true;
                break;
            }
        }
    }
    if(!cnt) sol[config]=1;
    else if(good) sol[config]=1;
    else sol[config]=-1;
}
void solve(){
    scanf("%lld", &n);
    for(i=1; i<=n; ++i){
        cnt=0;
        for(j=22; j>=1; --j) {scanf("%lld", &lst[j]); if(lst[j]) ++cnt;}
        ll config=0;
        for(j=1; j<=22; ++j) config=2*config+lst[j];
        if(sol[config]==1) out+=cnt;
    }
    printf("%lld", out);
}