Problem:
Problem K:
Cat Numbers!
ねこのアリストテレスは数学の問題を考えるのを趣味にしている。今彼が考えている問題は以下のようなものである。
1以上の自然数
A
,
B
(
A
<
B
) に対して、
A
から
B
までの自然数の和を
C
、
A
と
B
を十進表記して
A
,
B
の順に結合したものを
D
とすると、両者が等しくなることがある。たとえば1から5までの和は15、2から7までの和は27、7から119までの和は 7119、といった具合である。このような
A
と
B
のペアのことを cat numbers と呼ぶことにする。アリストテレスは、
A
と
B
の桁数が与えられたときに、cat numbersを全て列挙したい、と考えた。
アリストテレスは、
A
または
B
を固定した場合に解が存在するかどうかを確かめる方法は思いついたので、小さい桁数に対しては答えを得ることができた。しかし、桁数が大きくなるにしたがって計算をするのが大変になり、途中でうんざりして投げ出してしまった。そこで、あなたにお願いがある。アリストテレスに代わって、指定された桁数のcat numbersを全て列挙するプログラムを書いてほしい。
Input
入力は1行のみからなる。
A
の桁数
a
および
B
の桁数
b
が1つの空白文字で区切られて与えられる。これらは 1 ≤
a
≤
b
≤ 16 を満たす。
Output
指定された桁数のcat numbersを、
A
が小さいものから順に出力せよ。
A
が同じものが複数ある場合は、
B
が小さいものから出力せよ。各行には1つのcat numbersにおける
A
と
B
を1つの空白文字で区切ったものを出力せよ。また、条件に合うcat numbersが存在しない場合は "No cats." と1行に出力せよ。
Notes on Submission
上記形式で複数のデータセットが与えられます。入力データの 1 行目にデータセットの数が与えられます。各データセットに対する出力を上記形式で順番に出力するプログラムを作成して下さい。
Sample Input
4
1 1
1 3
1 4
2 2
Output for the Sample Input
1 5
2 7
7 119
No cats.
13 53
18 63
33 88
35 91

Submitted solutions:

code_snippet: #include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <numeric>
#include <utility>
#include <iomanip>
#include <algorithm>
#include <functional>
using namespace std;

typedef long long ll;
typedef vector<int> vint;
typedef vector<long long> vll;
typedef pair<int,int> pint;
typedef pair<long long, long long> pll;

#define MP make_pair
#define PB push_back
#define ALL(s) (s).begin(),(s).end()
#define EACH(i, s) for (__typeof__((s).begin()) i = (s).begin(); i != (s).end(); ++i)
#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
template<class T1, class T2> ostream& operator << (ostream &s, pair<T1,T2> P) 
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, vector<T> P) 
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, vector<vector<T> > P) 
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }
template<class T1, class T2> ostream& operator << (ostream &s, map<T1,T2> P) 
{ EACH(it, P) { s << "<" << it->first << "->" << it->second << "> "; } return s; }



long long pow(long long a, long long n) {
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * a;
        a = a * a;
        n >>= 1;
    }
    return res;
}

vector<long long> divisor(long long n) {
    vector<long long> res;
    for (long long i = 1LL; i*i <= n; ++i) {
        if (n%i == 0LL) {
            res.push_back(i);
            long long temp = n/i;
            if (i != temp) res.push_back(temp);
        }
    }
    sort(res.begin(), res.end());
    return res;
}

int N;
long long a, b;

vll div1[20];
vll div2[20];

int main() {
    long long num = 1;
    for (int i = 1; i <= 16; ++i) {
        num *= 10;
        div1[i] = divisor(num);
        div2[i] = divisor(num-1);
        
        for (int j = 0; j < div1[i].size(); ++j) {
            //COUT(i); COUT(j);
            if ( (div1[i][j] & 1) || (div1[i][j] % (1LL<<i) == 0) ) continue;
            div1[i].erase(div1[i].begin() + j--);
        }
    }
    
    cin >> N;
    for (int id = 0; id < N; ++id) {
        cin >> a >> b;
        long long ten = pow(10LL, b);
        long long ano = pow(10LL, b) - 1;
        
        long long CA = pow(10LL, a-1);
        long long CB = pow(10LL, b-1);
        long long HI = pow(10LL, max(a+1, b+1));
        
        //COUT(a); COUT(b); COUT(div1); COUT(div2);
        
        vector<pll> res;
        for (int i = 0; i < div2[b].size(); ++i) {
            for (int j = 0; j < div1[b].size(); ++j) {
                long long p = div1[b][j] * div2[b][i];
                if (p > HI) break;
                if (p < CB*10-10) continue;
                
                long long q = (ten/div1[b][j]) * (ano/div2[b][i]);
                if (p < q) continue;
                
                long long A = (p + q + 1)/2 - ten;
                long long B = (p - q + 1)/2;
                
                //cout << p << ", " << q << " : " << A << ", " <<B << endl;
                
                if (A >= CA && A < CA * 10 && B >= CB && B < CB * 10) {
                    res.PB(pll(B, A));
                }
            }
        }
        sort(ALL(res));
        for (int i = 0; i < res.size(); ++i) {
            cout << res[i].second << " " << res[i].first << endl;
        }
        if (res.size() == 0) puts("No cats.");
    }
    return 0;
}
accuracy: 1
time_ms: 1770
memory_kb: 3388
final_rank: 4

code_snippet: #pragma GCC optimize("Ofast")
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <cstdio>
#include <ctime>
#include <assert.h>
#include <chrono>
#include <random>
#include <numeric>
#include <set>
#include <deque>
#include <stack>
#include <sstream>
#include <utility>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <tuple>
#include <array>
#include <bitset>
using namespace std;
typedef long long int ll;
typedef unsigned long long ull;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll myRand(ll B) {
    return (ull)rng() % B;
}
inline double time() {
    return static_cast<double>(chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now().time_since_epoch()).count()) * 1e-9;
}

/*
ミラーラビン素数判定法
参考資料
- https://ja.wikipedia.org/w/index.php?curid=946915
- https://nyaannyaan.github.io/library/prime/fast-factorize.hpp.html

奇素数 p に対し、次が成立する。
x^2 ≡ 1 (mod p) ⇔ x = -1, 1 (mod p)

p は p - 1 = 2^s × d と表すことができる。
この時、任意の自然数 a に対し次のいずれかが真となる。
- a^d ≡ 1 (mod p)
- a^{2^r * d} ≡ -1 (mod p) (0 <= r <= s-1)

証明：
フェルマーの小定理より、
a^{p-1} ≡ a^{2^s × d} ≡ 1 (mod p)
この平方根は上で述べた事実より、-1 または 1 (mod p) である。
-1 の場合、後者の式が成立。
1　の場合、更に平方根を取る操作を繰り返すと同様の議論に帰着する。
最後まで -1 とならなかった場合、前者の式が成立。

この命題の対偶をとる。
奇数 n に対してある数 a が存在し、
- a^d ≢ 1 (mod n) かつ
- 任意の r (0 <= r <= s-1) について、a^{2^r * d} ≢ -1 (mod n)
ならば、n は合成数である。

幾つかの a の値を試しそのいずれかに対しても合成数と判断されなければ素数である。
任意の n < 2^64 を満たす n に対して正確に判定できる a の値が知られている。
参考：http://miller-rabin.appspot.com/
*/

/*
ポラードのρ法
参考資料
- https://qiita.com/Kiri8128/items/eca965fe86ea5f4cbb98
- https://manabitimes.jp/math/1192
*/

// verify：https://www.acmicpc.net/problem/4149
namespace factorize{
    using u64 = uint64_t;
    using u128 = __uint128_t;
    mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

    u64 binary_gcd(u64 a, u64 b) {
        if (a == 0) return b;
        if (b == 0) return a;
        const int n = __builtin_ctzll(a | b);
        a >>= __builtin_ctzll(a);
        while (b > 0) {
            b >>= __builtin_ctzll(b);
            if (a > b) std::swap(a, b);
            b -= a;
        }
        return a << n;
    }

    u128 pow (u128 a, u64 n, u128 mod) {
        u128 res = 1;
        if (a >= mod) a %= mod;
        while (n > 0) {
            if (n & 1) {
                res *= a;
                if (res >= mod) res %= mod;
            }
            a *= a;
            if (a >= mod) a %= mod;
            n >>= 1;
        }
        return res;
    }

    bool miller_rabin (u64 n, vector<u64> v) {
        u64 d = n-1;
        while (~d & 1) d >>= 1;
        for (u64 a:v) {
            if (n <= a) break;
            u64 t = d;
            u128 y = pow(a, t, n);
            while (t != n-1 and y != 1 and y != n-1) {
                y *= y; if(y >= n) y %= n;
                t *= 2;
            }
            if (y != n-1 and t % 2 == 0) return false;
        }
        return true;
    }
    
    bool is_prime (u64 n) {
        if (n <= 1) return false;
        if (~n & 1) return (n == 2);
        if (n < (1LL << 30)) {
            return miller_rabin(n, {2, 7, 61});
        }
        else {
            return miller_rabin(n, {2, 325, 9375, 28178, 450775, 9780504, 1795265022});
        }
    }

    template <typename T>
    T pollard_rho (T n) {
        if (~n & 1) return 2;
        if (is_prime(n)) return n;

        static u128 x,y,c,d;
        auto f = [&](u128 x) {return (x * x % n + c) % n;};
        auto rnd_ = [&](T l, T r) {return rng() % (r - l + 1) + l;};

        x = rnd_(2, n);
        y = x;
        c = rnd_(1, n);
        d = 1;

        while (d == 1) {
            x = f(x);
            y = f(y); y = f(y);
            d = binary_gcd((x > y ? x-y : y-x), n);
            if (d == n) {
                return pollard_rho(n);
            }
        }
        if (is_prime(d)) {
            return d;
        }
        else {
            return pollard_rho(d);
        }
    }

    template <typename T>
    vector<T> prime_factor (T n) {
        vector<T> res;
        for (T i = 2; i*i <= n;) {
            while (n % i == 0) {
                n /= i;
                res.emplace_back(i);
            }
            i += 1 + (~n & 1);
            if (i >= 101 and n >= (1<<20)) {
                while (n > 1) {
                    auto p = pollard_rho(n);
                    while (n % p == 0) {
                        n /= p;
                        res.emplace_back(p);
                    }
                }
                break;
            }
        }
        if (n > 1) res.emplace_back(n);
        sort(res.begin(), res.end());
        return res;
    }

} // namespace factorize

int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int qq; cin >> qq;
    while(qq--){
        int a,b; cin >> a >> b;
        vector<pair<ll,ll>> res;
        vector<ll> v,vv;
        for(int i=0;i<b;i++){
            v.push_back(2);
        }
        for(int i=0;i<b;i++){
            v.push_back(5);
        }
        ll u = 1;
        for(int i=0;i<b;i++){
            u *= 10;
        }
        u--;
        vv = factorize::prime_factor(u);
        auto make_vec=[](vector<ll> v)->vector<ll>{
            vector<ll> res={1};
            for(ll p:v){
                vector<ll> nres = res;
                for(ll pp:res){
                    nres.push_back(pp*p);
                }
                res = nres;
                sort(res.begin(), res.end());
                res.erase(unique(res.begin(), res.end()),res.end());
            }
            return res;
        };
        v = make_vec(v);
        vv = make_vec(vv);
        for(auto p:v){
            for(auto pp:vv){
                __int128 S = (__int128)p * (__int128)pp;
                __int128 T = (__int128)((u+1)/p) * (__int128)(u/pp);
                // U = A-B
                // R = A+B
                __int128 U = S-(u+1);
                __int128 R = T-(u);
                if(U+R>0 and (U+R)%2==0 and R>0){
                    ll A = (U+R)/2;
                    ll B = R-A;
                    if(to_string(A).size() != a or to_string(B).size() != b)continue;
                    res.push_back({A,B});
                }
            }
        }
        sort(res.begin(), res.end());
        if(res.size() == 0){
            cout << "No cats." << "\n";
        }
        else{
            for(auto p:res){
                cout << p.first <<  " " << p.second << "\n";
            }
        }
    }

}
accuracy: 1
time_ms: 10
memory_kb: 3604
final_rank: 2

code_snippet: #pragma GCC optimize("Ofast")
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <cstdio>
#include <ctime>
#include <assert.h>
#include <chrono>
#include <random>
#include <numeric>
#include <set>
#include <deque>
#include <stack>
#include <sstream>
#include <utility>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <tuple>
#include <array>
#include <bitset>
using namespace std;
typedef long long int ll;
typedef unsigned long long ull;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll myRand(ll B) {
    return (ull)rng() % B;
}
inline double time() {
    return static_cast<double>(chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now().time_since_epoch()).count()) * 1e-9;
}

/*
ミラーラビン素数判定法
参考資料
- https://ja.wikipedia.org/w/index.php?curid=946915
- https://nyaannyaan.github.io/library/prime/fast-factorize.hpp.html

奇素数 p に対し、次が成立する。
x^2 ≡ 1 (mod p) ⇔ x = -1, 1 (mod p)

p は p - 1 = 2^s × d と表すことができる。
この時、任意の自然数 a に対し次のいずれかが真となる。
- a^d ≡ 1 (mod p)
- a^{2^r * d} ≡ -1 (mod p) (0 <= r <= s-1)

証明：
フェルマーの小定理より、
a^{p-1} ≡ a^{2^s × d} ≡ 1 (mod p)
この平方根は上で述べた事実より、-1 または 1 (mod p) である。
-1 の場合、後者の式が成立。
1　の場合、更に平方根を取る操作を繰り返すと同様の議論に帰着する。
最後まで -1 とならなかった場合、前者の式が成立。

この命題の対偶をとる。
奇数 n に対してある数 a が存在し、
- a^d ≢ 1 (mod n) かつ
- 任意の r (0 <= r <= s-1) について、a^{2^r * d} ≢ -1 (mod n)
ならば、n は合成数である。

幾つかの a の値を試しそのいずれかに対しても合成数と判断されなければ素数である。
任意の n < 2^64 を満たす n に対して正確に判定できる a の値が知られている。
参考：http://miller-rabin.appspot.com/
*/

/*
ポラードのρ法
参考資料
- https://qiita.com/Kiri8128/items/eca965fe86ea5f4cbb98
- https://manabitimes.jp/math/1192
*/

// verify：https://www.acmicpc.net/problem/4149
namespace factorize{
    using u64 = uint64_t;
    using u128 = __uint128_t;
    mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

    u64 binary_gcd(u64 a, u64 b) {
        if (a == 0) return b;
        if (b == 0) return a;
        const int n = __builtin_ctzll(a | b);
        a >>= __builtin_ctzll(a);
        while (b > 0) {
            b >>= __builtin_ctzll(b);
            if (a > b) std::swap(a, b);
            b -= a;
        }
        return a << n;
    }

    u128 pow (u128 a, u64 n, u128 mod) {
        u128 res = 1;
        if (a >= mod) a %= mod;
        while (n > 0) {
            if (n & 1) {
                res *= a;
                if (res >= mod) res %= mod;
            }
            a *= a;
            if (a >= mod) a %= mod;
            n >>= 1;
        }
        return res;
    }

    bool miller_rabin (u64 n, vector<u64> v) {
        u64 d = n-1;
        while (~d & 1) d >>= 1;
        for (u64 a:v) {
            if (n <= a) break;
            u64 t = d;
            u128 y = pow(a, t, n);
            while (t != n-1 and y != 1 and y != n-1) {
                y *= y; if(y >= n) y %= n;
                t *= 2;
            }
            if (y != n-1 and t % 2 == 0) return false;
        }
        return true;
    }
    
    bool is_prime (u64 n) {
        if (n <= 1) return false;
        if (~n & 1) return (n == 2);
        if (n < (1LL << 30)) {
            return miller_rabin(n, {2, 7, 61});
        }
        else {
            return miller_rabin(n, {2, 325, 9375, 28178, 450775, 9780504, 1795265022});
        }
    }

    template <typename T>
    T pollard_rho (T n) {
        if (~n & 1) return 2;
        if (is_prime(n)) return n;

        static u128 x,y,c,d;
        auto f = [&](u128 x) {return (x * x % n + c) % n;};
        auto rnd_ = [&](T l, T r) {return rng() % (r - l + 1) + l;};

        x = rnd_(2, n);
        y = x;
        c = rnd_(1, n);
        d = 1;

        while (d == 1) {
            x = f(x);
            y = f(y); y = f(y);
            d = binary_gcd((x > y ? x-y : y-x), n);
            if (d == n) {
                return pollard_rho(n);
            }
        }
        if (is_prime(d)) {
            return d;
        }
        else {
            return pollard_rho(d);
        }
    }

    template <typename T>
    vector<T> prime_factor (T n) {
        vector<T> res;
        for (T i = 2; i*i <= n;) {
            while (n % i == 0) {
                n /= i;
                res.emplace_back(i);
            }
            i += 1 + (~n & 1);
            if (i >= 101 and n >= (1<<20)) {
                while (n > 1) {
                    auto p = pollard_rho(n);
                    while (n % p == 0) {
                        n /= p;
                        res.emplace_back(p);
                    }
                }
                break;
            }
        }
        if (n > 1) res.emplace_back(n);
        sort(res.begin(), res.end());
        return res;
    }

} // namespace factorize

int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int qq; cin >> qq;
    while(qq--){
        int a,b; cin >> a >> b;
        vector<pair<ll,ll>> res;
        vector<ll> v,vv;
        for(int i=0;i<b;i++){
            v.push_back(2);
        }
        for(int i=0;i<b;i++){
            v.push_back(5);
        }
        ll u = 1;
        for(int i=0;i<b;i++){
            u *= 10;
        }
        u--;
        vv = factorize::prime_factor(u);
        auto make_vec=[](vector<ll> v)->vector<ll>{
            vector<ll> res={1};
            for(ll p:v){
                vector<ll> nres = res;
                for(ll pp:res){
                    nres.push_back(pp*p);
                }
                res = nres;
                sort(res.begin(), res.end());
                res.erase(unique(res.begin(), res.end()),res.end());
            }
            return res;
        };
        v = make_vec(v);
        vv = make_vec(vv);
        for(auto p:v){
            for(auto pp:vv){
                __int128 S = (__int128)p * (__int128)pp;
                __int128 T = (__int128)((u+1)/p) * (__int128)(u/pp);
                // U = A-B
                // R = A+B
                __int128 U = S-(u+1);
                __int128 R = T-(u);
                if(U+R>0 and (U+R)%2==0 and R>0){
                    ll A = (U+R)/2;
                    ll B = R-A;
                    if(to_string(A).size() != a or to_string(B).size() != b)continue;
                    res.push_back({A,B});
                }
            }
        }
        sort(res.begin(), res.end());
        if(res.size() == 0){
            cout << "No cats." << "\n";
        }
        else{
            for(auto p:res){
                cout << p.first <<  " " << p.second << "\n";
            }
        }
    }

}
accuracy: 1
time_ms: 10
memory_kb: 3404
final_rank: 1

code_snippet: #include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <numeric>
#include <utility>
#include <iomanip>
#include <algorithm>
#include <functional>
using namespace std;

typedef long long ll;
typedef vector<int> vint;
typedef vector<long long> vll;
typedef pair<int,int> pint;
typedef pair<long long, long long> pll;

#define MP make_pair
#define PB push_back
#define ALL(s) (s).begin(),(s).end()
#define EACH(i, s) for (__typeof__((s).begin()) i = (s).begin(); i != (s).end(); ++i)
#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
template<class T1, class T2> ostream& operator << (ostream &s, pair<T1,T2> P) 
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, vector<T> P) 
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, vector<vector<T> > P) 
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }
template<class T1, class T2> ostream& operator << (ostream &s, map<T1,T2> P) 
{ EACH(it, P) { s << "<" << it->first << "->" << it->second << "> "; } return s; }



long long pow(long long a, long long n) {
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * a;
        a = a * a;
        n >>= 1;
    }
    return res;
}

vector<long long> divisor(long long n) {
    vector<long long> res;
    for (long long i = 1LL; i*i <= n; ++i) {
        if (n%i == 0LL) {
            res.push_back(i);
            long long temp = n/i;
            if (i != temp) res.push_back(temp);
        }
    }
    sort(res.begin(), res.end());
    return res;
}

int N;
long long a, b;

vll div1[20];
vll div2[20];

int main() {
    long long num = 1;
    for (int i = 1; i <= 16; ++i) {
        num *= 10;
        div1[i] = divisor(num);
        div2[i] = divisor(num-1);
        
        for (int j = 0; j < div1[i].size(); ++j) {
            //COUT(i); COUT(j);
            if ( (div1[i][j] & 1) || (div1[i][j] % (1LL<<i) == 0) ) continue;
            div1[i].erase(div1[i].begin() + j--);
        }
    }
    
    cin >> N;
    for (int id = 0; id < N; ++id) {
        cin >> a >> b;
        long long ten = pow(10LL, b);
        long long ano = pow(10LL, b) - 1;
        
        long long CA = pow(10LL, a-1);
        long long CB = pow(10LL, b-1);
        long long HI = pow(10LL, max(a+1, b+1));
        
        //COUT(a); COUT(b); COUT(div1); COUT(div2);
        
        vector<pll> res;
        for (int i = 0; i < div2[b].size(); ++i) {
            for (int j = 0; j < div1[b].size(); ++j) {
                long long p = div1[b][j] * div2[b][i];
                if (p > HI) break;
                if (p < CB*10-10) continue;
                
                long long q = (ten/div1[b][j]) * (ano/div2[b][i]);
                if (p < q) continue;
                
                long long A = (p + q + 1)/2 - ten;
                long long B = (p - q + 1)/2;
                
                //cout << p << ", " << q << " : " << A << ", " <<B << endl;
                
                if (A >= CA && A < CA * 10 && B >= CB && B < CB * 10) {
                    res.PB(pll(B, A));
                }
            }
        }
        sort(ALL(res));
        for (int i = 0; i < res.size(); ++i) {
            cout << res[i].second << " " << res[i].first << endl;
        }
        if (res.size() == 0) puts("No cats.");
    }
    return 0;
}
accuracy: 1
time_ms: 2350
memory_kb: 1260
final_rank: 2