//#include #include #include #include using namespace std; #define endl '\n' #define int long long #define MAXN 5005 #define module 1000000007ll ifstream cin("connectem.in"); ofstream cout("connectem.out"); int n, m, br; vector > v; int dp[MAXN], ways[MAXN]; int fact[200005]; int pow(int a, int b){ if(b == 0) return 1; if(b % 2 != 0) return (a * pow(a, b - 1)) % module; int res = pow(a, b / 2); return (res * res) % module; } int divide(int a, int b){ return (a * pow(b, module - 2)) % module; } int binom(int k, int n){ return divide(fact[n], (fact[k] * fact[n - k]) % module); } inline void solve(){ cin >> n >> m >> br; v = vector >(); for(int i = 0; i < br; ++i){ int x, y; cin >> x >> y; v.push_back({x, y}); } sort(v.begin(), v.end()); dp[0] = 1; ways[0] = 1; for(int i = 1; i < v.size(); ++i){ int maximum = 0; //cout << v[i].first << ' ' << v[i].second << " HERE\n"; for(int z = i - 1; z >= 0; --z){ if(v[i].first >= v[z].first && v[i].second >= v[z].second){ maximum = max(maximum, dp[z]); } } dp[i] = maximum + 1; int sum = 0; for(int z = i - 1; z >= 0; --z){ if(v[i].first >= v[z].first && v[i].second >= v[z].second){ if(dp[z] == maximum){ int n = v[i].first - v[z].first, m = v[i].second - v[z].second; //cout << n << ' ' << n + m << endl; sum += ways[z] * binom(n, n + m); sum %= module; } } } //cout << i << ' ' << ways[i] << endl; ways[i] = sum; } cout << dp[br - 1] << ' ' << ways[br - 1] << endl; } signed main(){ cin.tie(0); ios::sync_with_stdio(false); fact[0] = 1; fact[1] = 1; for(int i = 2; i <= 200005; ++i){ fact[i] = i * fact[i - 1]; fact[i] %= module; } int tests; cin >> tests; for(int i = 0; i < tests; ++i){ solve(); } return 0; }