Pagini recente » Cod sursa (job #2942211) | Borderou de evaluare (job #101039) | Cod sursa (job #2062588) | Cod sursa (job #383307) | Cod sursa (job #2239922)
#include <bits/stdc++.h>
using namespace std;
ifstream in("vanatoare.in");
ofstream out("vanatoare.out");
const int DIM = 16;
pair<int, int> fnc[1 << DIM];
int dp[1 << DIM], ant[1 << DIM];
int extendedEuclid(int a, int b, long long &x, long long &y)
{
if (!b) {
x = 1; y = 0;
return a;
} else {
long long x0, y0; int d;
d = extendedEuclid(b, a % b, x0, y0);
x = y0; y = x0 - y0 * (a / b);
return d;
}
}
pair<int, int> computeFunction(pair<int, int> fnc1, pair<int, int> fnc2, int t)
{
if (fnc1.first < fnc2.first)
swap(fnc1, fnc2);
if (fnc1 == make_pair(0, 0) || fnc2 == make_pair(0, 0))
return make_pair(0, 0);
long long x, y, gcd, lcm, c, val, pos;
gcd = extendedEuclid(fnc1.second, fnc2.second, x, y);
lcm = 1LL * fnc1.second * fnc2.second / gcd;
c = fnc2.first - fnc1.first;
if (c % gcd != 0)
return make_pair(0, 0);
c /= gcd; val = (x * c) % (fnc2.second / gcd);
val = (val + fnc2.second / gcd) % (fnc2.second / gcd);
pos = (val * fnc1.second + fnc1.first) % lcm;
pos = (pos + lcm) % lcm;
return (pos <= t) ? make_pair((int)pos, (int)min((long long)(t + 1), lcm)) :
make_pair(0, 0);
}
void debug()
{
pair<int, int> f = computeFunction(make_pair(3, 5), make_pair(3, 4), 10);
cout << f.first << " " << f.second << endl;
exit(0);
}
int main(void)
{
//debug();
int n, t; in >> n >> t;
for (int i = 0; i < n; ++i)
in >> fnc[1 << i].first >> fnc[1 << i].second;
for (int msk = 1; msk < (1 << n); ++msk)
if (msk ^ (msk & -msk))
fnc[msk] = computeFunction(fnc[msk & -msk], fnc[msk ^ (msk & -msk)], t);
for (int msk = 1; msk < (1 << n); ++msk) {
dp[msk] = (fnc[msk] != make_pair(0, 0)) ? 1 : n + 1;
for (int axm = msk; axm; (--axm) &= msk)
if (dp[msk] > dp[axm] + dp[msk ^ axm])
dp[msk] = dp[axm] + dp[msk ^ axm], ant[msk] = axm;
}
out << dp[(1 << n) - 1] << endl;
for (int msk = (1 << n) - 1; msk; msk = ant[msk])
out << fnc[msk ^ ant[msk]].first << " ";
return 0;
}