Огляд
У цьому виклику вам дадуть два числа, які є невеликим зміщенням, більшим за кратне число середнього розміру. Ви повинні вивести середнє число, яке є майже дільником обох чисел, за винятком невеликого зміщення.
Розмір числа бере участь буде параметризованих параметром складності, l
. Ваша мета - вирішити проблему якнайбільше l
за менше 1 хвилини.
Налаштування
У заданій проблемі буде секретне число p
, яке буде випадковим l^2
( l*l
) бітовим числом. Буде два множника, q1, q2
які будуть випадковими l^3
бітовими числами, і буде два зміщення r1, r2
, які будуть випадковими l
бітовими числами.
Вхід до вашої програми буде x1, x2
визначено як:
x1 = p * q1 + r1
x2 = p * q2 + r2
Ось програма для генерації тестових випадків на Python:
from random import randrange
from sys import argv
l = int(argv[1])
def randbits(bits):
return randrange(2 ** (bits - 1), 2 ** bits)
p = randbits(l ** 2)
print(p)
for i in range(2):
q_i = randbits(l ** 3)
r_i = randbits(l)
print(q_i * p + r_i)
Перший рядок виводу є можливим рішенням, а другий та третій рядки - це вхід, який буде надано вашій програмі.
Ваша програма
З огляду на x1
, x2
і l
ви повинні знайти l^2
розрядне число p'
таких , що x1 % p'
і x2 % p'
обидва l
бітових чисел. p
завжди працюватиме, хоча можуть бути й інші можливості. Ось функція перевірки рішення:
def is_correct(x1, x2, l, p_prime):
p_prime_is_good = p_prime >> (l**2 - 1) and not p_prime >> l ** 2
x1_is_good = (x1 % p_prime) >> (l-1) and not (x1 % p_prime) >> l
x2_is_good = (x2 % p_prime) >> (l-1) and not (x2 % p_prime) >> l
return bool(p_prime_is_good and x1_is_good and x2_is_good)
Приклад
Припустимо l
, що 3. Програма генератора вибирає 9-розрядне число для p
, яке в даному випадку є 442
. Генератор вибирає два 3
бітні числа для r1, r2
, які є 4, 7
. Генератор вибирає два 27
бітні числа для q1, q2
, які є 117964803, 101808039
. Через ці варіанти x1, x2
є 52140442930, 44999153245
.
Вашій програмі буде надано 52140442930, 44999153245
як вхід, і вона повинна виводити 9-бітове число (в діапазоні [256, 511]
) таким чином, що 52140442930
і 44999153245
за модулем це число дає 3 бітні числа (в діапазоні [4, 7]
). 442
в цьому випадку є єдиним таким значенням, тому ваша програма повинна виводити 442
.
Більше прикладів
l = 2
x1 = 1894
x2 = 2060
p = 11
No other p'.
l = 3
x1 = 56007668599
x2 = 30611458895
p = 424
No other p'.
l = 6
x1 = 4365435975875889219149338064474396898067189178953471159903352227492495111071
x2 = 6466809655659049447127736275529851894657569985804963410176865782113074947167
p = 68101195620
I don't know whether there are other p'.
l = 12
x1 = 132503538560485423319724633262218262792296147003813662398252348727558616998821387759658729802732555377599590456096450977511271450086857949046098328487779612488702544062780731169071526325427862701033062986918854245283037892816922645703778218888876645148150396130125974518827547039720412359298502758101864465267219269598121846675000819173555118275197412936184329860639224312426860362491131729109976241526141192634523046343361089218776687819810873911761177080056675776644326080790638190845283447304699879671516831798277084926941086929776037986892223389603958335825223
x2 = 131643270083452525545713630444392174853686642378302602432151533578354175874660202842105881983788182087244225335788180044756143002547651778418104898394856368040582966040636443591550863800820890232349510212502022967044635049530630094703200089437589000344385691841539471759564428710508659169951391360884974854486267690231936418935298696990496810984630182864946252125857984234200409883080311780173125332191068011865349489020080749633049912518609380810021976861585063983190710264511339441915235691015858985314705640801109163008926275586193293353829677264797719957439635
p = 12920503469397123671484716106535636962543473
I don't know whether there are other p'.
l = 12
x1 = 202682323504122627687421150801262260096036559509855209647629958481910539332845439801686105377638207777951377858833355315514789392768449139095245989465034831121409966815913228535487871119596033570221780568122582453813989896850354963963579404589216380209702064994881800638095974725735826187029705991851861437712496046570494304535548139347915753682466465910703584162857986211423274841044480134909827293577782500978784365107166584993093904666548341384683749686200216537120741867400554787359905811760833689989323176213658734291045194879271258061845641982134589988950037
x2 = 181061672413088057213056735163589264228345385049856782741314216892873615377401934633944987733964053303318802550909800629914413353049208324641813340834741135897326747139541660984388998099026320957569795775586586220775707569049815466134899066365036389427046307790466751981020951925232623622327618223732816807936229082125018442471614910956092251885124883253591153056364654734271407552319665257904066307163047533658914884519547950787163679609742158608089946055315496165960274610016198230291033540306847172592039765417365770579502834927831791804602945514484791644440788
p = 21705376375228755718179424140760701489963164
Оцінка балів
Як було сказано вище, оцінка вашої програми є найвищою, l
яку програма завершує за 1 хвилину. Більш конкретно, ваша програма буде працювати в 5 випадкових екземплярах з цим l
, і вона повинна вивести правильну відповідь на всі 5, із середнім часом менше 1 хвилини. Оцінка програми буде найвищою, на l
яку вона вдається. Викрадач буде середнім часом на це l
.
Щоб дати вам уявлення про те, до яких балів слід прагнути, я написав дуже просту розв'язку. Він отримав оцінку 5. Я написав набагато більш шалені рішення. Він отримав оцінку 12 або 13, залежно від удачі.
Деталі
Для ідеальної порівняльності між відповідями, я піду час на своєму ноутбуці, щоб дати канонічні оцінки. Я також буду запускати однакові випадково вибрані екземпляри у всіх поданнях, щоб дещо полегшити удачу. Мій ноутбук має 4 процесора, процесор i5-4300U при 1,9 ГГц, 7,5 г оперативної пам’яті.
Не соромтеся розміщувати попередній бал, виходячи із власних термінів, просто дайте зрозуміти, тимчасовий він чи канонічний.
Нехай виграє найшвидша програма!
l^2
бітове число, яке l
не є фактором обох чисел, працює. Однак, як правило, лише один.