import math
import os
import random
import sys

MAX_N = 10**9
MAX_M = 10**7
MAX_K = MAX_M

SQRT_MAX_N = int(math.sqrt(MAX_N))

CASE = 1
DEST = os.path.join(os.getcwd(), '../data/secret')

STATIC_CASES_FIRST = [
    (1, 1, 1, 'onegnome'),
    (1, 1, MAX_K, 'onegnome'),
    (1, MAX_M, MAX_K, 'onegnome'),
    (10, 1, 2, 'onegroup'),
    (MAX_N, 1, SQRT_MAX_N, 'onegroup'),
    (MAX_M, MAX_M, MAX_M, 'one_per_group'),
    (MAX_N, 1, 1, 'maxanswer'),
    (MAX_N, MAX_M, 1, 'maxanswer'),
]
STATIC_CASES_LAST = [
    (974812803, 66004, 22002, None),
    (10**9, 72476, 14496, None),
    (638804436, 1564021, 365, None), # step2 23.4%
    (644652616, 2033582, 358, None), # step2 20.1%
    (710589017, 3085079, 330, None), # step2 15.5%
    (192339091, 834062, 318, None),  # step2 16.1%
    (883855158, 3642327, 286, None), # step2 10.4%
    (487570820, 990744, 270, None),  # step2 17.3%
    (809307126, 2527811, 260, None), # step2 14.2%
    (725108168, 3080028, 250, None), # step2 11.3%
    (217483664, 925101, 236, None),  # step2 13.6%
    (614849863, 1202690, 218, None), # step2 9.7%
    (134073964, 640167, 215, None),  # step2 12.4%
    (959975502, 9533328, 96, None),  # step2 6.3%
    (583646519, 7100574, 75, None),  # step2 4.9%
    (929160702, 9809225, 38, None),  # step2 6.4%
    (154713447, 8907714, 29, None),  # step2 1.1%
    (402184194, 9019984, 24, None),  # step2 5.8%
    (999999992, 621010, 19, None),   # step2 0.1%
    (117422939, 9297239, 9, None),   # step2 4.8%
    (246803546, 9612873, 7, None),   # step2 3.8%
    (MAX_N, MAX_M, 7, None),
    (256943658, 8509802, 7, None),   # step2 4.3%
    (MAX_N, MAX_M, 6, None),
    (MAX_N, MAX_M, 5, None),
    (472628586, 9038436, 5, None),
    (923979912, 7138295, 5, None),
    (MAX_N, MAX_M, 4, None),
    (186304556, 4566296, 4, None),   # step2 0.5%
    (MAX_N, MAX_M, 3, None),
    (441529078, 7927028, 3, None),
    (959480162, 8819476, 3, None),
    (MAX_N, MAX_M, 2, None),
]


def next_file(short_desc=None, long_desc=None):
    global CASE
    basename = os.path.join(DEST, '%02d' % CASE)
    CASE += 1
    if short_desc is not None:
        basename += '-' + short_desc
    if long_desc is not None:
        with open(basename+'.desc', 'w') as desc_out:
            desc_out.write(long_desc)
    return open(basename+'.in', 'w')

def save_case(n, m, k, short_desc=None, long_desc=None, shuffle_adj_list=True):
    assert 1 <= n <= MAX_N
    assert 1 <= m <= MAX_M
    assert 1 <= k <= MAX_K
    sys.stderr.write('save case %d %d %d\n' % (n, m, k))
    f = next_file(short_desc, long_desc)
    f.write('%d %d %d\n' % (n, m, k))
    f.close()

    
def main():
    random.seed(13)

    for (n, m, k, d) in STATIC_CASES_FIRST:
        save_case(n, m, k, short_desc=d)
        
    for _ in range(3):
        n = random.randint(2, 50)
        m = random.randint(2, n)
        k = random.randint(1, 10)
        save_case(n, m, k, short_desc='random_small')

    for _ in range(3):
        n = random.randint(500, MAX_N)
        m = random.randint(2, 100)
        k = random.randint(1, 100)
        save_case(n, m, k, short_desc='random_large_n_small_mk')

    for _ in range(3):
        n = random.randint(500, MAX_N)
        m = random.randint(2, MAX_M)
        k = random.randint(1, 100)
        save_case(n, m, k, short_desc='random_large_nm_small_k')

    for _ in range(3):
        n = random.randint(500, MAX_N)
        m = random.randint(2, MAX_M)
        k = random.randint(1, SQRT_MAX_N)
        save_case(n, m, k, short_desc='random_large_nm_medium_k')

    for _ in range(3):
        n = random.randint(500, MAX_N)
        m = random.randint(2, MAX_M)
        k = random.randint(1, MAX_K)
        save_case(n, m, k, short_desc='random_large')

    for (n, m, k, d) in STATIC_CASES_LAST:
        save_case(n, m, k, short_desc=d)

if __name__=='__main__':
    main()
