#include using namespace std; #include #define rep(i, l, r) for (int i = (int)(l); i<(int)(r); i++) #define ll long long int K; vector S; vector T; bool isok1() { using mint = atcoder::static_modint<1000000021>; auto calc = [&]() -> mint { mint hash = 0; vector A(K); rep(i, 0, K) { A[i] = 0; mint t = 1; for (int j = (int)S[i].size()-1; j >= 0; j--) { A[i] += t * (S[i][j]-'0'); t *= 10; } } // rep(i, 0, K) cout << A[i].val() << " "; // cout << endl; ll sum = 0; for (int i = K-1; i >= 0; i--) { mint F = mint(10).pow(sum); mint G = mint(10).pow((int)S[i].size()); //1 + G + ... + G^T[i]-1 //G^T[i]-1/G-1 // cout << F.val() << " " << G.val() << " "; mint P = G.pow(T[i])-1; P /= (G-1); // cout << P.val() << " "; P *= F; P *= A[i]; // cout << P.val() << endl; hash += P; sum += T[i]%1000000020*(int)S[i].size(); sum %= 1000000020; } // cout << "hash : " << hash.val() << endl; return hash; }; mint h1 = calc(); reverse(S.begin(), S.end()); reverse(T.begin(), T.end()); for (string& s : S) reverse(s.begin(), s.end()); mint h2 = calc(); return h1 == h2; } bool isok2() { using mint = atcoder::static_modint<1000000033>; auto calc = [&]() -> mint { mint hash = 0; vector A(K); rep(i, 0, K) { A[i] = 0; mint t = 1; for (int j = (int)S[i].size()-1; j >= 0; j--) { A[i] += t * (S[i][j]-'0'); t *= 10; } } ll sum = 0; for (int i = K-1; i >= 0; i--) { mint F = mint(10).pow(sum); mint G = mint(10).pow((int)S[i].size()); //1 + G + ... + G^T[i]-1 //G^T[i]-1/G-1 mint P = G.pow(T[i])-1; P /= (G-1); P *= F; P *= A[i]; hash += P; sum += T[i]%1000000032*(int)S[i].size(); sum %= 1000000032; } return hash; }; mint h1 = calc(); reverse(S.begin(), S.end()); reverse(T.begin(), T.end()); for (string& s : S) reverse(s.begin(), s.end()); mint h2 = calc(); return h1 == h2; } int main() { cin >> K; S.resize(K); T.resize(K); rep(i, 0, K) cin >> S[i] >> T[i]; bool f = isok1() and isok2(); cout << (f? "Yes" : "No") << endl; }