Cod sursa(job #1744974)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 20 august 2016 20:05:35
Problema Vanatoare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#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;
}