範例程式碼 uva10273

//uva10273
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int __gcd(int a,int b){
  if(a*b==0)return abs(a+b);
  while(a%=b)swap(a,b);
  return b;
}

int main() {
    int kase;
    cin>>kase;
    while(kase--){
        int n, days=1;
        cin>>n;
        vector<vector<int>> cows;
        for(int i=0;i<n;i++){
            int sz;
            cin>>sz;
            vector<int> tmp(sz);
            days = days / __gcd(days, sz) * sz;
            for(auto& x:tmp)
                cin>>x;
            cows.push_back(tmp);
        }
        vector<bool> eaten(n, false);
        int last_day = -1;
        for(int i=0;i<last_day+days+1;i++){
            int m_cow = -1, alive = false;
            for(int j=0;j<n;j++){
                if(eaten[j])continue;

                if(m_cow == -1){
                    m_cow = j;
                    continue;
                }
                int cur_cow = cows[j][i%cows[j].size()];
                int min_cow = cows[m_cow][i%cows[m_cow].size()];
                if(cur_cow == min_cow){
                    alive = true;
                    continue;
                }
                if(cur_cow < min_cow){
                    alive = false;
                    m_cow = j;
                }
            }
            if(!alive && m_cow!=-1){
                eaten[m_cow] = true;
                last_day = i;
                days = 1;
                for(int j = 0; j < n; j++){
                    if(eaten[j]) continue;
                    days = days / __gcd(days, int(cows[j].size())) * cows[j].size();
                }
            }
        }
        int alive_num = 0;
        for(int i = 0; i < n; i++)
            alive_num += !eaten[i];
        
        cout<< alive_num << " " << last_day+1 << endl;
    }
}