#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <map> 
#include <string>
#include <vector>  
#include <iostream> 
#include <sstream> 
#include <queue>
#include <algorithm>

using namespace std;
 
#define ll long long
#define PB 		push_back
#define FOR(a,start,end) 	for(int a=int(start); a<int(end); a++)
#define INF 		INT_MAX
#define SORT(a) 	sort(a.begin(),a.end()) 
#define CL(a,x) 		memset(a,x,sizeof(a))
#define REP(a,x)	for(int a=0;a<x;a++)
#define REP1(a,x)	for(int a=1;a<=x;a++)
#define MP 		make_pair

 
 
typedef vector<int>     vi;
typedef pair<int,int>     pii; 
typedef vector<string> vs;
typedef vector<pii> vii;
typedef vector<vector<int> > vvi;
typedef vector<vector<string> > vvs;
typedef vector<pair<string,string> > vss;
typedef pair<string,string> pss; 
typedef pair<int,pii> ppii;
typedef vector<ppii> vppii;
typedef vector<vector<pii> > vvii;
typedef vector<vvi> vvvi;


ll k1,k2;
int w,i0,i,j,k,n,a,i2;
int z,c,d,t,z1,n0;
int m,b; 
int cas,g,ng,p,np;
int a1,a2,b1,b2;

vi vn,vk,va,vc,vb; 
vii vx;
vppii vp,vd;
vvi vvk,vvp;	
pii p1,p2,p0; 
int ta[100],tk[100];

pii dru(int i0, int i2){
	int kmin,i,j,i1,i3;
	ll z1max,z2max;
	pii p2,p3;

	if(i0>i2)
		return MP(0,1);
	else if(i0==i2){
		if(vx[i0].first==1)
			return MP(1,1);
		else
			return MP(0,0);
	}
	kmin=0;
	
	j=i0;
	for(i=i0;i<=i2;i++){
		if(vx[i].first>kmin){
			kmin=vx[i].first;
			j=i;
		}
	}
	i1=max(i0,j-kmin+1);
	i3=min(i2,j+kmin-1);
	for(i=j-1;i>=max(i0,j-kmin+1);i--){
		if(vx[i].first>kmin||vx[i].second<kmin){
			i1=i+1;
			break;
		}
	}
	for(i=j+1;i<=min(i2,j+kmin-1);i++){
		if(vx[i].first>kmin||vx[i].second<kmin){
			i3=i-1;
			break;
		}
	}
	if(i3-i1+1<kmin)
		return MP(0,0);
	
	z1max=0;
	z2max=1;
	for(i=i1;i<=i3-kmin+1;i++){
		p2=dru(i0,i-1);
		p3=dru(i+kmin,i3);
		if((ll)(p2.first+p3.first)>z1max){
			z1max=(ll)(p2.first+p3.first);
			z2max=((ll)p2.second*(ll)p3.second)%d;
		}
		else if((z1max!=0)&&((ll)(p2.first+p3.first)==z1max)){
			//z1max=(ll)(p2.first+p3.first);
			z2max+=((ll)p2.second*(ll)p3.second)%d;
			z2max%=d;
		}
	}
	z1max++;
	return MP((int)z1max,(int)z2max);
	 
}


int main() {  
//	freopen( "c:\\wojtek\\uva\\pa\\debug\\t2.in", "rt", stdin);  
	//	int czas=clock();
	//pi=2*acos(0.0);
	  
	//scanf("%ld",&t);
	//cin>>t;
	//for(cas=0;cas<t;cas++){
	cin>>n;
	d=1000000007;
	vx.clear();
	
	for(i=0;i<n;i++){
		cin>>a1>>b1;
		vx.push_back(MP(a1,b1));
			
	}
		//dzielimy na przedziały 1/1
	vk.clear();
	for(i=0;i<n;i++){
		if(vx[i].first==1&&vx[i].second==1)
			vk.push_back(i);
	}
	i0=0;
	k1=vk.size();
	k2=1;
	if(k1>0){
		for(i=0;i<vk.size();i++){
			p1=dru(i0,vk[i]-1);
			k1+=p1.first;
			k2*=(ll)p1.second;
			k2%=d;
			i0=vk[i]+1;
		}
		p1=dru(i0,n-1);
		k1+=p1.first;
		k2*=(ll)p1.second;
		k2%=d;
		

	}
	else {
		p1=dru(0,n-1);
		k1+=p1.first;
		k2*=(ll)p1.second;
		k2%=d;
	}


	if(k2<=0)
		cout<<"NIE"<<endl;
	else {
		
		cout<<k1<<" "<<k2<<endl;
	}

	
	

	

	//czas = clock() - czas;
	//printf("%lf\n",double(czas)/CLOCKS_PER_SEC);					

			
	return 0;
	 
} 
