Pagini recente » Cod sursa (job #382372) | Cod sursa (job #2848725) | Cod sursa (job #2047733) | Cod sursa (job #148828) | Cod sursa (job #1744974)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("vanatoare.in");
ofstream cout("vanatoare.out");
const int MAXN = 16;
int t;
int Gcd(int a, int b) {
int r;
while (b) {
r = a % b;
a = b;
b = r;
}
return a;
}
pair<int, int> v[MAXN], dp[1 << MAXN];
int answer[1 << MAXN], lcm[1 << MAXN];
int Compute(pair<int, int> a, pair<int, int> b) {
int answer = 0;
if ((a.second - b.second) % Gcd(a.first, b.first) != 0)
return -1;
if (a.first < b.first)
swap(a, b);
for (answer; (long long)answer + a.second <= t; answer += a.first)
if ((answer + a.second) % b.first == b.second)
return answer + a.second;
return -1;
}
int main() {
int n;
cin >> n >> t;
for (int i = 0; i < n; i++)
cin >> v[i].second >> v[i].first;
sort(v, v + n);
lcm[0] = 1;
for (int i = 1; i < (1 << n); i++) {
int j;
for (j = n - 1; j >= 0 && !(i & (1 << j)); j--);
lcm[i] = min((long long)t + 1, (long long)lcm[i - (1 << j)] * v[j].first / Gcd(lcm[i - (1 << j)], v[j].first));
if (answer[i - (1 << j)] == -1)
answer[i] = -1;
else
answer[i] = Compute(make_pair(lcm[i - (1 << j)], answer[i - (1 << j)]), make_pair(v[j].first, v[j].second));
dp[i] = make_pair(n + 1, -1);
for (j = i; j > 0; j = i & (j - 1))
if (answer[j] != -1)
dp[i] = min(dp[i], make_pair(dp[i - j].first + 1, j));
}
cout << dp[(1 << n) - 1].first << "\n";
for (int i = (1 << n) - 1; i; i -= dp[i].second)
cout << answer[dp[i].second] << " ";
return 0;
}