Cod sursa(job #171583)

Utilizator damaDamaschin Mihai dama Data 4 aprilie 2008 16:42:20
Problema Vanatoare Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

#define x first
#define y second

const int nm = 1 << 16;

using namespace std;



int d[nm], n, t, conf, sz, m[nm], prev[nm];
long long r[16], p[16], D;
vector<int> v, sol;

void bkt(int, long long, long long);
int calculeaza(int);
pair<long long, long long> gcd_e(long long, long long);

int main()
{
	freopen("vanatoare.in", "r", stdin);
	freopen("vanatoare.out", "w", stdout);

	scanf("%d %d", &n, &t);

	for(int i = 0; i < n; ++i)
	{
		scanf("%d %d", &r[i], &p[i]);
	}

	bkt(0, 0 , 1);
	sz = v.size();
	(void)calculeaza((1 << n) - 1);

	printf("%d\n", d[(1 << n) - 1]);

	conf = (1 << n) - 1;
	while(prev[conf] ^ conf)
	{
		sol.push_back(m[conf ^ prev[conf]]);
		conf = prev[conf];
	}
	sort(sol.begin(), sol.end());

	for(int i = 0; i < sol.size(); ++i)
	{
		printf("%d ", sol[i]);
	}
	printf("\n");



	return 0;
}

void bkt(int k, long long rest, long long div)
{
	if(k < n)
	{
		pair<long long, long long> temp;
		int new_val;
		bkt(k + 1 , rest, div);
		temp = gcd_e(div, p[k]);
		new_val = temp.x * (div / D) * (r[k] - rest) + rest;
	//	printf("%d %d %d\n", k, temp.x, new_val);
		if(new_val % div == rest && new_val % p[k] == r[k])
		{
			rest = new_val;
			div = div / D * p[k];
			if(rest <= t)
			{
				conf |= (1 << k);
				d[conf] = 1;
				v.push_back(conf);
				m[conf] = rest;
				bkt(k + 1, rest, div);
				conf ^= (1 << k);
			}
		}
	}
}

pair<long long, long long> gcd_e(long long a,long long b)
{
	if(b == 0)
	{
		D = a;
		return make_pair(1, 0);
	}
	else
	{
		pair<long long, long long> temp = gcd_e(b, a % b);
		return make_pair(temp.y, temp.x - a / b * temp.y);
	}
}

int calculeaza(int config)
{
	int i, min = n;
	int temp;
	if(d[config])
		return d[config];
	for(i = 0; i < sz; ++i)
	{
		if((config & v[i]) == v[i])
		{
			temp = calculeaza(config ^ v[i]);
			if(min > temp + 1)
			{
				min = temp + 1;
				prev[config] = (conf ^ v[i]);
			}
		}
	}
	d[config] = min;
	
	return d[config];
}