Cod sursa(job #2233264)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 22 august 2018 19:00:09
Problema Vanatoare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include<fstream>
#include<algorithm>
#define DIM (1 << 16) + 5
using namespace std;
int n, t, i, ii, j, nr;
int d[DIM], tt[DIM], sol[20];
long long a[DIM], b[DIM], x, y, dif, c, val;
ifstream fin("vanatoare.in");
ofstream fout("vanatoare.out");
long long cmmdc(long long a, long long b){
    long long r;
    while(b != 0){
        r = a % b;
        a = b;
        b = r;
    }
    return a;
}
void ff(long long a, long long b, long long &x, long long &y){
    if(b == 0){
        x = 1;
        y = 0;
    }
    else{
        long long x2, y2;
        ff(b, a % b, x2, y2);
        x = y2;
        y = x2 - a / b * y2;
    }
}
int main(){
    fin>> n >> t;
    for(i = 0; i < n; i++){
        fin>> a[ (1 << i) ] >> b[ (1 << i) ];
    }
    for(ii = 1; ii < (1 << n); ii++){
        for(i = 0; i < n; i++){
            if( ( (ii >> i) & 1) == 1){
                j = ii - (1 << i);
                i = (1 << i);
                break;
            }
        }
        if(j == 0){
            continue;
        }
        if(a[j] == -1){
            b[ii] = a[ii] = -1;
            continue;
        }
        if(b[j] > t){
            if(a[j] % b[i] == a[i]){
                a[ii] = a[j];
                b[ii] = b[j];
            }
            else{
                a[ii] = b[ii] = -1;
            }
            continue;
        }
        c = cmmdc(b[j], b[i]);
        dif = a[i] - a[j];
        if(dif % c != 0){
            a[ii] = b[ii] = -1;
            continue;
        }
        ff(b[j], b[i], x, y);
        b[ii] = b[i] * b[j] / c;
        x *= dif / c;
        y *= dif / c;
        val = (b[j] * x + a[j]) % b[ii];
        if(val < 0){
            val += b[ii];
        }
        if(val <= t){
            a[ii] = val;
        }
        else{
            a[ii] = b[ii] = -1;
        }
    }
    for(ii = 1; ii < (1 << n); ii++){
        if(a[ii] != -1){
            d[ii] = 1;
            tt[ii] = ii;
            continue;
        }
        d[ii] = 1000000;
        for(i = ii; i > 0; i = (ii & (i - 1) ) ){
            if(a[i] != -1){
                if(d[ii] > 1 + d[ii - i]){
                    d[ii] = 1 + d[ii - i];
                    tt[ii] = i;
                }
            }
        }
    }
    fout<< d[(1 << n) - 1] <<"\n";
    ii = (1 << n) - 1;
    while(ii != 0){
        sol[++nr] = a[ tt[ii] ];
        ii -= tt[ii];
    }
    sort(sol + 1, sol + nr + 1);
    for(i = 1; i <= nr; i++){
        fout<< sol[i] <<" ";
    }
    return 0;
}