#include using namespace std; const long long MAXP = 10000; const long long INF = 1000000000; const long long UNUSED = -1; const long long USED = 0; class planetoid { public: long long mass; long long xyz[3]; long long v[3]; long long itime; // next intersection time long long ixyz[3]; // location of next intersection long long cmass; // cumulative mass long long cv[3]; // cumulative velocities of intersecting rocks long long nint; // # of rocks intersecting, if lowest indexed rock; -1 otherwise } pl[MAXP]; long long dim[3]; long long gcd(long long a, long long b, long long& s, long long& t) { long long r=b, prevr = a; long long prevs=1, prevt = 0; s = 0, t = 1; while (r != 0) { long long q = prevr/r; long long tmp = r; r = prevr%r; prevr = tmp; tmp = s; s = prevs - q*s; prevs = tmp; tmp = t; t = prevt - q*t; prevt = tmp; } s = prevs; t = prevt; return prevr; } bool itime(long long a[], long long b[], long long mod[], long long i, long long &n, long long& m) { long long s, t; if (a[i] == 0 && b[i] != 0) return false; long long div = gcd(a[i], mod[i], s, t); //cout << "div = " << div << endl; //cout << a[i] << ',' << b[i] << ',' << mod[i] << ',' < b.xyz[0]) return true; if(a.xyz[0] == b.xyz[0]){ if(a.xyz[1] > b.xyz[1]) return true; if(a.xyz[1]==b.xyz[1]){ if(a.xyz[2] > b.xyz[2]) return true; } } } return false; } void Swap_Long(long long & a, long long& b){ long long temp = a; a = b; b = temp; } void Swap(planetoid& a, planetoid& b){ Swap_Long(a.mass, b.mass); Swap_Long(a.itime, b.itime); Swap_Long(a.cmass,b.cmass); Swap_Long(a.nint, b.nint); for(int i = 0; i < 3; i++){ Swap_Long(a.xyz[i], b.xyz[i]); Swap_Long(a.v[i], b.v[i]); Swap_Long(a.ixyz[i], b.ixyz[i]); Swap_Long(a.cv[i], b.cv[i]); } } int main() { long long n; cin >> n >> dim[0] >> dim[1] >> dim[2]; for(int i=0; i> pl[i].mass; cin >> pl[i].xyz[0] >> pl[i].xyz[1] >> pl[i].xyz[2]; cin >> pl[i].v[0] >> pl[i].v[1] >> pl[i].v[2]; } long long earliest = 0; int ipass = 0; while (earliest != INF) { //cout << "Pass " << ++ipass << ", number of planetoids = " << n << endl; earliest = INF; for(int i=0; i 0 && t <= earliest) { earliest = t; if (pl[j].nint == UNUSED || pl[j].itime > t) { pl[j].itime = t; for(int k=0; k<3; k++) { pl[j].ixyz[k] = (pl[j].xyz[k]+t*pl[j].v[k])%dim[k]; if (pl[j].ixyz[k] < 0) pl[j].ixyz[k] += dim[k]; pl[j].cv[k] = pl[j].v[k]+pl[i].v[k]; } pl[j].cmass = pl[j].mass + pl[i].mass; pl[j].nint = 2; } else if (pl[j].nint != USED) { for(int k=0; k<3; k++) { pl[j].cv[k] += pl[i].v[k]; } pl[j].cmass += pl[i].mass; pl[j].nint++; } pl[i].nint = USED; pl[i].itime = t; /* cout << "Planetoids " << j << " and " << i << " meet at time " << t << " at location ("; cout << pl[j].ixyz[0] << ','; cout << pl[j].ixyz[1] << ','; cout << pl[j].ixyz[2] << ')' << endl; cout << "mass and velocity of " << i << " = " << pl[i].mass << " ("; cout << pl[i].v[0] << ','; cout << pl[i].v[1] << ','; cout << pl[i].v[2] << ')' << endl; cout << "cumulative mass and velocity of " << i << " = " << pl[j].cmass << " ("; cout << pl[j].cv[0] << ','; cout << pl[j].cv[1] << ','; cout << pl[j].cv[2] << ')' << endl; /**/ } } } long long newn = n; for(int i=n-1; i>=0; i--) { if (pl[i].itime == earliest) { if (pl[i].nint > 0) { pl[i].mass = pl[i].cmass; for(int k=0; k<3; k++) { pl[i].xyz[k] = pl[i].ixyz[k]; pl[i].v[k] = pl[i].cv[k]/pl[i].nint; } } else if (pl[i].nint == USED) { pl[i] = pl[--newn]; } } else if (earliest != INF) { for(int k=0; k<3; k++) { pl[i].xyz[k] += earliest*pl[i].v[k]; pl[i].xyz[k] %= dim[k]; if (pl[i].xyz[k] < 0) pl[i].xyz[k] += dim[k]; } } } n = newn; } for(int i = 0; i < n; i++) for(int j = 0; j < n-1; j++){ if(Less_Than(pl[j], pl[j+1])) Swap(pl[j], pl[j+1]); } cout << n << endl; for(int i=0; i