Pagini recente » Cod sursa (job #1353651) | Cod sursa (job #477784) | Cod sursa (job #370178) | Cod sursa (job #955379) | Cod sursa (job #2233264)
#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;
}