Pagini recente » Cod sursa (job #1302331) | Cod sursa (job #2986937) | Rating Adonis Farcas (adonisfarcas) | Cod sursa (job #2005) | Cod sursa (job #2592679)
#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';
}
}