Cod sursa(job #2592679)

Utilizator levladiatorDragutoiu Vlad-Ioan levladiator Data 2 aprilie 2020 02:04:16
Problema Adapost 2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <iostream>
#include <bits/stdc++.h>
#define vmax 1000005
#define nmax 100005
using namespace std;
ifstream f("colectie.in");
ofstream g("colectie.out");
int  p1[18][11],n,k,p2[18][11],mij,sol=2000,sol1,sol2;
long long int need[11];

map<vector<int> ,int > m;
map<vector<int> ,int > :: iterator it;
void read()
{
    f>>n>>k;
    mij=n/2;
    for(int i=1; i<=mij; i++)
    {
        for(int j=0; j<10; j++)
        {
            f>>p1[i][j];
        }
    }
    for(int i=mij+1; i<=n; i++)
    {
        for(int j=0; j<10; j++)
        {
            f>>p2[i-mij][j];
        }
    }
}
void precalculare()
{
    int i, put = 1, gr, rest, cifrest;
    while(put <= k)
    {
        put *= 10;
        gr = k / put;
        rest = k % put;
        for(i = 0; i < 10; ++i)
            need[i] += gr * (put / 10);
        cifrest = rest / (put / 10);
        for(i = 0; i < cifrest; ++i)
            need[i] += put / 10;
        need[cifrest] += (rest % (put / 10) + 1);
    }
    for(put = 1; put <= k; put *= 10)
        need[0] -= put;
}
void jumate1()
{
    int lim=(1<<mij);
    for(int i=0; i<lim; i++)
    {
        vector<int> cf(10,0);
        for(int j=0; j<mij; j++)
        {
            if(i&(1<<j))
            {
                for(int d=0; d<10; d++)
                {
                    cf[d]+=p1[j+1][d];
                }
            }
        }
        if(m.find(cf)==m.end())
        {
            m[cf]=i;
        }
        else
        {
            int p=m[cf];
            if(__builtin_popcount(i)<__builtin_popcount(p))
            {
                m[cf]=i;
            }
        }
    }
}
void jumate2()
{
    mij=n-mij;
    int lim=(1<<mij);
     for(int i=0; i<lim; i++)
    {
        vector<int> cf(10,0);
        for(int j=0; j<mij; j++)
        {
            if(i&(1<<j))
            {
                for(int d=0; d<10; d++)
                {
                    cf[d]+=p2[j+1][d];
                }
            }
        }
        for(int j=0;j<10;j++)
        {
            cf[j]=need[j]-cf[j];
        }
       if(m.find(cf)!=m.end())
       {
           int nr2=__builtin_popcount(i);
           int nr1=__builtin_popcount(m[cf]);
           if(nr1+nr2<sol)
           {
                sol=nr1+nr2;
                sol1=m[cf];
                sol2=i;
           }
       }
    }
}
int main()
{
    read();
    precalculare();
    jumate1();
    jumate2();
    mij=n/2;
    if(sol!=2000)
    {
      g<<1<<'\n';
      g<<sol<<'\n';
      for(int i=0;i<mij;i++)
      {
          if(sol1&(1<<i)) g<<i+1<<" ";

      }
      for(int i=0;i<=mij;i++)
      {
          if(sol2&(1<<i)) g<<i+1+mij<<" ";
      }

    }
    else
    {
        g<<0<<'\n';
    }
}